首页 > 其他分享 >异常概述及其抛出与捕获机制

异常概述及其抛出与捕获机制

时间:2024-07-31 21:27:06浏览次数:18  
标签:抛出 捕获 try 概述 catch 处理程序 异常 throw

文章目录

一、异常概述

1.1 什么是异常

异常(exception)是在程序执行期间发生的事件,它会破坏程序指令的正常流程。

exception 是 exceptional event 的缩写

当方法中发生错误时,该方法创建一个对象并将其交给运行时系统。该对象称为异常对象(exception object),包含有关错误的信息,包括其类型和错误发生时程序的状态。创建异常对象并将其交给运行时系统称为抛出异常(throw exception)

1.2 引入异常的好处

引入异常处理机制为程序设计提供了许多好处,以下是主要的一些好处:

  • 将错误处理代码与常规代码分开
  • 在调用堆栈中传播错误
  • 分组并区分错误类型

1.3 异常处理流程

在一个方法抛出异常后,运行时系统试图在调用堆栈中搜索包含可以处理异常的代码块的方法。该代码块称为异常处理程序(exception handler)

搜索从发生错误的方法开始,并以调用方法的相反顺序继续通过调用堆栈。当找到合适的处理程序时,运行时系统将异常传递给处理程序。如果抛出的异常对象的类型与处理程序可以处理的类型匹配,则认为异常处理程序是合适的。

在这里插入图片描述

简单来说,异常处理的逻辑遵循调用链,即从方法的调用者向上传递

1.4 异常处理机制的要求

异常通常分为已检查异常(Checked Exceptions)、未检查异常(Unchecked Exceptions)、错误(Errors)。其中,抛出已检查异常的代码必须满足以下两种情况之一

  • 捕获异常(Catch the Exception):使用try语句捕获异常。try语句必须提供异常处理程序,即包含catch块,用于处理可能抛出的异常。

    try {
        // 可能抛出异常的代码
    } catch (SomeException e) {
        // 异常处理代码
    }
    
  • 指定异常(Specify the Exception):方法声明中指定它可能抛出异常。方法必须提供throws子句,列出可能抛出的异常。

    public void someMethod() throws SomeException {
        // 可能抛出异常的代码
    }
    

如果代码不满足上述要求,将无法编译通过。

二、异常类型

2.1 异常类别

异常分为三大类:

  • 已检查异常(Checked Exceptions)
    • 这些异常是编译时异常,必须要么被捕获要么被声明。编译器在在编译阶段会进行检查。
    • 这些是编写良好的应用程序应该预见并从中恢复的异常条件。
    • 例如:FileNotFoundExceptionIOException, SQLException
  • 未检查异常(Unchecked Exceptions)
    • 这些异常是运行时异常,继承自RuntimeException 。未检查异常存在争议
    • 这些异常是应用程序内部的异常情况,应用程序通常无法预测或恢复。这些通常表明编程错误,如逻辑错误或 API 使用不当。
    • 例如:NullPointerException, ArrayIndexOutOfBoundsException
  • 错误(Errors)
    • 这些是由 JVM 引发的严重错误,继承自Error
    • 这些是应用程序外部的异常情况,应用程序通常无法预测或从中恢复。
    • 例如:OutOfMemoryError, StackOverflowError

其中,未检查异常(Unchecked Exceptions) 和错误(Errors)不需要遵循捕获或指定异常的要求。也就是说,针对这两种异常,我们可以不用编写异常处理程序进行处理。

注意:编译时异常是指编译器在编译阶段进行检查的异常类型,但这些异常实际上是在程序运行时可能会发生的。例如,FileNotFoundException 是编译时异常,如果指定的文件在运行时不存在,则会抛出这个异常。

2.2 Exception 类的层次

Throwable 类的直接后代有:

  • Error: 错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
  • Exception:所有的异常类都是 java.lang.Exception 类的子类。

在这里插入图片描述

三、抛出异常

3.1 throws 关键字

throws 关键字是 Java 中用于方法声明的一部分,它指明了该方法可能会抛出某些类型的已检查异常。可以这样理解,方法不仅需要告诉编译器将要返回什么值,还要告诉编译器有可能发生什么错误

public void readFile(String fileName) throws FileNotFoundException {
    // 方法实现
}

3.2 throw 关键字

throw 关键字可以在代码中抛出一个异常对象。当一个方法使用 throw 抛出异常时,程序控制权会转移到该方法的调用者。调用者需要有适当的 try-catch 结构来捕获并处理该异常。

throw 语句需要一个参数:一个可抛出对象。可抛出对象是 Throwable 类的任何子类的实例。

throw someThrowableObject;

示例如下:

public void validate(int value) {
    if (value < 0) {
        throw new IllegalArgumentException("Negative value not allowed.");
    }
}

3.3 链式异常

应用程序通常通过抛出另一个异常来响应已发生的异常。换句话说,第一个异常可能会导致第二个异常的产生。了解何时一个异常会导致另一个异常是非常重要的,这种机制被称为链式异常(Chained Exception),它有助于程序员追踪异常的源头和原因。

Throwable 常见的支持链式异常的方法如下:

Throwable getCause()
Throwable initCause(Throwable)
Throwable(String, Throwable)
Throwable(Throwable)

示例如下:

try {

} catch (IOException e) {
    throw new SampleException("Other IOException", e);
}

这段代码展示了如何在捕获 IOException 异常后,创建一个新的自定义异常 SampleException,并附加原始原因。然后,将异常链抛出到下一个更高级别的异常处理程序。

3.4 throw 和 throws 的区别

当你在方法中使用 throw 抛出异常时,这表示在特定条件下发生了某种错误。使用 throws 声明异常时,你是在声明这个方法可能会引发错误,以便调用这个方法的代码能做好相应的异常处理。

throw 和 throws 的区别在于:

特性throwthrows
作用抛出一个异常实例声明方法可能抛出的异常类型
使用位置方法内部方法签名(声明部分)
语法格式throw new ExceptionType()void methodName() throws ExceptionType
强制要求不强制要求捕获调用方法时必须捕获或继续声明异常

四、捕获异常(异常处理程序)

在抛出异常后,运行时系统会在调用堆栈中找到异常处理程序来处理该异常。

另外,异常处理程序里面可以在 catch 块里面再次抛出异常与链式异常。通常,希望改变异常的类型时才会这样做。

4.1 try-catch-finally

异常处理程序主要是由异常处理程序组件 try、catch 、finally 来实现。其中:

  • try:用于捕获异常。try 块不能单独存在,后面至少跟着一个 catch块 或者 一个 finally 块,也可以跟着多个 catch 块。
  • catch:处理异常,被称为异常处理程序。另外,单个catch 块可以处理多种类型的异常,不同类型的异常用 |分割
  • finally:用于在异常处理结束后执行清理工作,无论是否抛出异常。当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。注意,当 JVM 退出时,finally 块可能不会执行
try {
    // 初始化资源或执行可能抛出异常的操作
    resource = initializeResource()

        // 执行主要操作
        performMainTask(resource)

} catch (SpecificExceptionType1 exception1) {
    // 处理特定类型的异常1
    handleExceptionType1(exception1)

} catch (SpecificExceptionType2 exception2) {
    // 处理特定类型的异常2
    handleExceptionType2(exception2)

} catch (GeneralException exception) {
    // 处理其他一般性异常
    handleGeneralException(exception)

} finally {
    // 清理资源或执行无论如何都会执行的操作
    if (resource is not null) {
        resource.close()
    }
}

4.2 try-with-resources

try-with-resource 语法结构,旨在自动管理资源,确保资源在使用后能够及时关闭,避免资源泄露 。无论代码块中的操作是否成功,资源都会在 try 代码块执行完毕后自动关闭。。

try-with-resources 语句特别适合使用 Closeable 资源的情况,例如流。

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    // 读取文件的代码
} catch (IOException e) {
    // 处理异常
}

参考资料

Exceptions - Dev.java

Java 异常处理 | 菜鸟教程 (runoob.com)

Java基础常见面试题总结(下) | JavaGuide

标签:抛出,捕获,try,概述,catch,处理程序,异常,throw
From: https://blog.csdn.net/weixin_44814196/article/details/140832882

相关文章

  • 京准电钟,NTP网络时间服务器产品概述与应用
    京准电钟,NTP网络时间服务器产品概述与应用京准电钟,NTP网络时间服务器产品概述与应用京准电子科技官微——ahjzsz NTP时间服务器支持NTP和SNTP网络同步协议,是一款高精度、大容量、高安全性的时钟产品。设备硬件采用冗余架构设计,高精度时钟直接来源于GNSS系统中各个卫......
  • 概述C#中各种类型集合的特点
    在C#中,集合是用于存储和操作一组数据项的数据结构。这些集合通常位于System.Collections和System.Collections.Generic命名空间中。下面我将概述C#中几种常用的集合类型及其特点:1.System.Collections命名空间中的集合这个命名空间中的集合类型不支持泛型,因此在编译时不检......
  • HarmonyOS应用开发学习-HarmonyOs概述
    HarmonyOs概述HarmonyOs是一款面向万物互联时代的、全新的分布式操作系统在传统的单设备系统能力基础上,HarmonyOs提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机、PC、智能音箱、耳机、AR/VR眼镜等多种终端设备,提供全场景(......
  • Python捕获一组中的1000个项目进行处理
    我有一个包含数千条记录的大表(可能有3,000到75,000条记录),我将所有数字ID放入排序列表中。我想一次有序地处理一组1000个ID。我如何优雅地获取前1000个和“标签”,设置为“223344到337788”(字典在这里有意义吗,或者只是列表捕获中的第一个/最后一个项目......以跟......
  • Oracle知识整合----SQL概述
    目录一、SQL简介二、SQL语言的分类1、数据查询语言(DQL)2、数据操作/操纵(DML)3、数据定义语言(DDL)4、数据控制语言(DCL)5、事物控制语言(TCL)三、数据查询语言1、查询全部2、查询指定列3、在system下查询Scott的dept表,登录的用户的权限要比被查的用户的权限大4......
  • 我必须每秒捕获一帧的时间戳,但无法捕获整个事件。我能得到的最接近日期是“YYYY-MM-DD
    我正在尝试从左上角的一帧速率的视频中获取时间戳。我只能得到日期,不能得到整个时间戳。帮我获取整个时间戳我正在共享一个在预处理视频后得到的窗口。我本来希望获得整个时间戳,但我无法做到。我想要一个json文件中的整个时间戳,例如“2024-03-2916:36:20”,并且每个帧都......
  • 国密算法概述
    国密即国家密码局认定的国产密码算法,即商用密码。国密算法是国家密码局制定标准的一系列算法。其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM1,SM2,SM3等,其中:SM2为国家密码管理局公布的公钥算法,其加密强度为256位。其它几个重要的商用密码算法包括:SM1,......
  • File概述和File的构造方法
    File是什么    File对象表示路径,可以是文件,可以是文件夹,路径可以存在,可以不存在绝对路径vs相对路径    绝对路径:带盘符    相对路径:不带盘符,默认到当前项目下去找File的三种构造方法packagecom.chen.bao3;importjava.io.File;publi......
  • GPT1-3及BERT的模型概述
    GPT1-3及BERT的模型概述(2020年5月之前LLMs主流模型)GPT-1(2018年6月)......
  • 柿子多酚的概述
    一、柿子多酚的概述柿子多酚是柿子果实中多种酚类化合物的总称,这些化合物主要包括黄酮类、花青素类、类黄酮类以及其他酚酸类化合物等。这些多酚类化合物在柿子中的含量丰富,是柿子具有多种保健功能的重要物质基础。二、柿子多酚的组成柿子中的多酚类化合物种类繁多,主要包括以下......