Java高级应用——异常处理

news2024/11/18 22:58:09

文章目录

    • 异常处理
      • 概念
      • Java异常体系
      • Error 和 Exception
      • 编译时异常和运行时异常
      • Java异常处理的方式

异常处理

概念

异常处理是在程序执行过程中遇到错误或异常情况时的一种机制,它允许程序在错误发生时进行适当的处理,而不会导致程序崩溃或产生不可预测的结果。

  1. 异常类型:
    • 受检异常(Checked Exception):这些异常在编译时强制要求进行处理,例如IOException、SQLException等。程序必须使用try-catch块或throws语句显式处理这些异常。
    • 非受检异常(Unchecked Exception):也称为运行时异常(Runtime Exception),这些异常在编译时不强制要求进行处理,例如NullPointerException、ArrayIndexOutOfBoundsException等。程序可以选择处理或不处理这些异常。
  2. 异常处理机制:
    • try-catch语句块:使用try块包含可能引发异常的代码,并使用catch块捕获并处理特定类型的异常。如果try块中的异常与catch块中指定的异常类型匹配,那么相应的catch块将被执行。
    • finally块:无论是否发生异常,finally块中的代码始终会被执行。通常用于资源的释放,如关闭文件、数据库连接等。
    • throws关键字:在方法声明中使用throws关键字可以将异常抛出给调用者处理。如果一个方法可能抛出受检异常,但方法本身不处理该异常,可以使用throws关键字将其传递给上层调用者处理。
  3. 异常处理流程:
    • 当在try块中发生异常时,程序将立即跳转到与异常类型匹配的catch块。
    • 如果找不到匹配的catch块,异常将传递给调用者的上层方法,直至找到合适的catch块或达到程序的顶层(如main方法)。
    • 如果异常没有被处理,程序将终止并打印异常信息。
  4. 嵌套的try-catch块:
    • 可以在一个try块中嵌套另一个try-catch块,用于处理更细粒度的异常情况。
    • 内层的catch块先捕获并处理异常,如果没有匹配的catch块,则将异常传递给外层的catch块继续处理。
  5. 自定义异常:
    • 可以通过扩展Exception类或其子类来创建自定义异常类。
    • 自定义异常类可以添加额外的属性和方法,以满足特定的异常需求。
  6. 异常处理最佳实践:
    • 针对不同类型的异常进行具体的处理,避免使用过于宽泛的异常捕获。
    • 在catch块中记录异常信息,以便进行错误分析和调试。
    • 在finally块中释放资源,确保资源得到正确的处理。
    • 适当地使用throws关键字将异常传递给调用者,避免过度捕获异常。

Java异常体系

Java异常体系是Java编程语言中用于处理错误和异常情况的层次结构。它是基于类的,并且所有的异常类都是从java.lang.Throwable类派生的。

  1. java.lang.Throwable

    • Throwable是Java异常体系的根类,它是所有异常类的基类。
    • Throwable有两个子类:ErrorException

    Error 和 Exception

  2. java.lang.Error

    • Error表示严重的系统级错误,通常由虚拟机引发。
    • Error及其子类一般不被程序员捕获和处理,因为这些错误通常表示无法恢复的情况,如OutOfMemoryErrorStackOverflowError等。
  3. java.lang.Exception

    • Exception是所有非严重错误和异常的基类。
    • Exception分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。

    编译时异常和运行时异常

  4. 受检异常(Checked Exception):

    • 受检异常是在编译时强制要求进行处理的异常,以便程序能够在异常发生时进行适当的处理。
    • 受检异常是Exception类的子类,但不是RuntimeException的子类。
    • 例如:IOExceptionSQLException等。
  5. 非受检异常(Unchecked Exception):

    • 非受检异常是在编译时不强制要求进行处理的异常,通常是由程序逻辑错误或运行时错误引发的。
    • 非受检异常是RuntimeException类及其子类的实例。
    • 例如:NullPointerExceptionArrayIndexOutOfBoundsException等。

    在这里插入图片描述


    Java异常处理的方式

  6. 异常处理的关键字:

    • try:用于包含可能引发异常的代码块。
    • catch:用于捕获并处理特定类型的异常。
    • finally:用于定义在无论是否发生异常时都会执行的代码块。
    • throws:用于在方法声明中指定可能抛出的异常。
  7. Java异常处理提供了多种方式来捕获、处理和传递异常。下面是Java异常处理的详细细节:

    1. try-catch块:

      • try-catch块用于捕获和处理异常。

      • try块包含可能引发异常的代码。

      • catch块用于捕获并处理特定类型的异常。

      • 语法:

        try {
            // 可能引发异常的代码
        } catch (ExceptionType1 e1) {
            // 处理 ExceptionType1 类型的异常
        } catch (ExceptionType2 e2) {
            // 处理 ExceptionType2 类型的异常
        } finally {
            // finally 块中的代码无论是否发生异常都会执行
        }
        
      • catch块可以有多个,用于捕获不同类型的异常。

      • finally块中的代码无论是否发生异常都会执行,通常用于释放资源或进行清理操作。

    2. 异常传递:

      • 当在当前方法中无法处理异常时,可以将异常传递给上层调用方法处理。

      • 使用throws关键字在方法声明中指定可能抛出的异常。

      • 调用方法可以继续传递异常,或在其内部使用try-catch块捕获和处理异常。

      • 语法:

        void method1() throws ExceptionType1, ExceptionType2 {
            // 方法可能抛出的异常
        }
        
        void method2() throws ExceptionType1, ExceptionType2 {
            method1(); // 异常传递给调用方法处理
        }
        
    3. finally块:

      • finally块中的代码无论是否发生异常都会执行。
      • finally块通常用于释放资源、关闭文件、断开连接等清理操作,以确保代码执行完毕后资源得到正确释放。
      • 无论异常是否被捕获和处理,finally块中的代码都会被执行。
    4. throw语句:

      • throw语句用于显式地抛出异常。

      • 可以使用throw语句在任何地方抛出异常,包括方法中、catch块中或finally块中。

      • 语法:

        throw exception;
        
      • throw语句通常用于在某些条件下抛出特定类型的异常,以使程序进入异常状态。

    5. 自定义异常:

      • 可以通过扩展Exception类或其子类来创建自定义异常类。
      • 自定义异常类可以根据特定的应用程序需求添加额外的属性和方法。
      • 可以在代码中抛出自定义异常并使用try-catch块进行捕获和处理。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1046844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pdf怎么调整大小kb?pdf文件过大这样压缩

在日常的工作和生活中,我们常常会遇到需要调整PDF文件大小的问题。有时候,我们需要将大型的PDF文件上传到某些平台,但平台的限制让我们不得不压缩文件的大小。那么,如何有效地调整PDF文件的大小呢? 一、使用嗨格式压缩…

第三方开源测试框架 pytest

本篇文章是聊聊 Python 的单元测试框架,在Python 世界中最火的第三方单元测试框架:pytest。 它有如下主要特性: assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了)自动发现 测试模块和函数模块化夹…

ai智能写作软件,免费自动写作软件

无论你是一名热衷于撰写博客的博主,还是一位为企业撰写广告宣传的创意写手,都会面临一个共同的问题:时间和创意的压力。随着信息爆炸式增长,写作任务不仅变得更加频繁,还需要不断提供新的、有吸引力的内容,…

软考-计算机网络与系统安全

七层模型 网络技术标准与协议 TCP三次握手 DHCP协议:固定分配、动态分配和自动分配 DNS协议:递归查询,迭代查询 计算机网络分类 按分布范围: 局域网城域网广域网因特网 按拓扑结构分 总线型星型环型树型分布式 网络规划与设…

window.print()打印及出现的问题

<template><transition name"el-zoom-in-center"><div class"JNPF-preview-main"><div class"JNPF-common-page-header"><el-page-header back"goBack" :content"打印通知书" /><div clas…

护眼灯显色度越高越好吗?选儿童护眼台灯应该这样选

显色指数当然是越高越好了。LED灯作为一种新型的照明产品&#xff0c;具有节能、环保、寿命长等优点&#xff0c;受到越来越多的人们的青睐。但是&#xff0c;市面上的LED灯品牌琳琅满目&#xff0c;让人眼花缭乱。那么&#xff0c;LED灯什么牌子好呢&#xff1f;下面我们来推荐…

我们应该用什么酒袋来安全地运输葡萄酒?

无论是在朋友家、在公园还是在海滩&#xff0c;葡萄酒都会让每次聚会变得更美好。这时候运输葡萄酒就变得很有挑战性&#xff0c;你不仅有打破它们的危险&#xff0c;而且还可能因为暴露在高温或阳光下而伤害它们。来自来自云仓酒庄品牌雷盛红酒分享为了确保葡萄酒的安全到达&a…

leetCode 343.整数拆分 动态规划

给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解释: 10 3 …

Python实现IP的自动切换

一、安装所需库 在开始之前&#xff0c;我们首先需要确保已经安装了以下库&#xff1a; - requests&#xff1a;用于发送HTTP请求和获取网页内容。 - winreg&#xff1a;用于在Windows下访问和编辑注册表信息。 可以使用pip命令进行安装&#xff0c;例如&#xff1a; pip i…

PayPal面经

文章目录 初战AI Infra团队广泛收集信息&#xff0c;增加对面试相关团队的了解Paypal的AI infra Engineer 极客时间演讲视频&#xff1a;AI在金融应用HR面试首面 zhang chao首先让我介绍自己和项目基础知识出题 lettcode 1and0s 二面 luwen没有让我重复介绍自己那好&#xff0c…

linux操作系统--常用命令篇(网络安全、运维和测试人员必备技能)

前言&#xff1a;linux 命令是对 Linux 系统进行管理的命令。对于 Linux 系统来说&#xff0c;无论是中央处理器、内存、磁盘驱动器、键盘、鼠标&#xff0c;还是用户等都是文件&#xff0c; Linux 系统管理的命令是它正常运行的核心&#xff0c;与之前的 DOS 命令类似。linux …

设计模式 - 策略模式

目录 一. 前言 二. 实现 一. 前言 策略模式 (Strategy Pattern) 是指对一系列的算法定义&#xff0c;并将每一个算法封装起来&#xff0c;而且使它们还可以相互替换。此模式让算法的变化独立于使用算法的客户。 与状态模式的比较 状态模式的类图和策略模式类似&#xff0c;并…

sentinel 以及 sentinel-golang 让你的服务坚如磐石

首先要说 Sentinel&#xff0c;这是阿里巴巴内部使用多年并演化出来的流控软件&#xff0c;经受住了多年的双十一考验&#xff0c;最早是服务于Java语言的&#xff0c;在2020年推出了 Sentinel-golang 版本。 官方文档&#xff1a;https://sentinelguard.io/zh-cn/docs/introd…

GreatSQL一个关于主从复制的限制描述与规避

一、背景 分享一个在项目运维中遇到的一个主从复制限制的一个坑&#xff0c;项目的架构为主集群灾备集群&#xff0c;每个集群为一主两从模式。主集群到灾备集群的同步为主从复制的方式&#xff0c;根据业务需求灾备集群需要忽略系统库跟某些配置表&#xff0c;所以才会触发此…

24v转12v转9v转5v转4.2v降压电源芯片AH8788

AH8788A是一款集成同步开关的降压转换器&#xff0c;提供***解决方案适用于车载充电器、快充适配器和智能排插。AH8788A内置功率MOS&#xff0c;输入电压范围为9.6V到32V&#xff0c;输出电压范围为3V到12V&#xff0c;***-大可提供18W的输出功率。它能够根据识别到的快充协议自…

手把手教你用 Milvus 和 Towhee 搭建一个 AI 聊天机器人!

作为向量数据库的佼佼者&#xff0c;Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子&#xff0c;如果想要搭建一个负责聊天机器人数据管理流程&#xff0c;Milvus 必然是首选向量数据库。那么如何让这个应用程序开发变得易于管理及更好理解&#xff…

速看!美国站新增1个禁售品类,加拿大站3大品类开启售前审核

亚马逊新合规 美国&加拿大◀ 一品类禁售&#xff0c;三品类售前审核 近日&#xff0c;亚马逊发布了合规政策的新要求&#xff0c;其中美国站“呼吸贴”被归类为禁售的产品&#xff0c;加拿大站“儿童床垫”、“夜灯”、“儿童折叠式和非折叠式椅子和凳子”品类均有合规要…

家政服务小程序,家政系统开发

家政服务小程序&#xff0c;家政系统开发&#xff0c;打造一线家政系统&#xff0c;提效增收 家政服务小程序 互联网&#xff0b;家政系统&#xff0c;打造互联网&#xff0b;家政公司app开发&#xff0c;支持个性化定制&#xff0c;直接搭建&#xff0c;上手即用&#xff0e;实…

Redis〔篇〕

redis怎么做到双写一致性呢&#xff1f; 这个是要分情况的 业务要是对一致性要求不是很高的话可以使用延时双删&#xff0c;要强一致的话需要双写一致性。 Redis数据持久化&#xff1f; redis是有两种数据持久化方式的&#xff0c;一种RDB一种AOF rdb是redis数据快照&#x…

大型DOM结构是如何影响交互性的

没有办法绕过这一点&#xff1a;当你构建一个网页时&#xff0c;该页面一定会有一个文档对象模型&#xff08;DOM&#xff09;。DOM代表了你页面HTML的结构&#xff0c;并为JavaScript和CSS提供了访问页面结构和内容的途径。 然而&#xff0c;问题在于DOM的大小会影响浏览器快速…