目录
定义
Java标准裤内建了一些通用的异常,这些类以Throwable为顶层父类。
Throwable又派生出Error类和Exception类。
错误(Error)类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。
异常(Exception)是程序编译或运行时出现的错误或异常情况,它表示程序遇到了一种在正常情况下无法预料或处理的情况。在编程中,异常处理是一种机制,用于处理程序执行过程中可能出现的错误,以防止程序崩溃并提供错误处理的途径。
❗️❗️❗️语法错误不算在异常体系中,语法错误是自己的水平问题引起的。❗️❗️❗️
分类
编译时异常
- 编译阶段就要处理的异常,提醒可能出现的问题,在编辑代码过程中会标红警告,必须处理否则无法运行。
- 常见情况:
- 类找不到的异常:
ClassNotFoundException
- 文件找不到的异常:
FileNotFoundException
- 没有匹配的方法异常:
NoSuchMethodException
- 输入输出流异常:
IOException
- 数据库操作异常:
SQLException
- 类找不到的异常:
运行时异常
- 程序运行过程中出现的异常,考虑不周,出现的一些问题。
- 常见情况:
- 数组索引越界异常:
ArrayIndexOutOfBoundsException
- 空指针异常 :
NullPointerException
- 类型转换异常:
ClassCastException
- 迭代器遍历没有此元素异常:
NoSuchElementException
- 除0发生算数异常:
ArithmeticException
- 数组索引越界异常:
处理机制
在编写代码处理异常时,对于检查异常,有2种不同的处理方式:使用try...catch...finally
语句块处理它。或者,在函数签名中使用throws
声明交给函数调用者caller
去解决。
捕获异常
try {
//逻辑代码
}catch(exception e){
//异常处理代码
} finally{
//一定要执行的代码
}
try {
//逻辑代码
}catch(exception e){
//异常处理代码
}
try{
//逻辑代码
}finally{
//一定要执行的代码
}
- 一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
- finally仅在以下几种情况不执行:
- try块中的局部变量和catch块中的局部变量(包括异常变量),以及finally中的局部变量,他们之间不可共享使用。
- java中,当一个函数的某条语句发生异常时,这条语句的后面的语句不会再执行,它失去了焦点。执行流跳转到最近的匹配的异常处理catch代码块去执行,异常被处理完后,执行流会接着在处理了这个异常的catch代码块后面接着执行。
抛出异常
如果一个方法内部的代码会抛出检查异常(checked exception),而方法自己又没有完全处理掉,则javac保证你必须在方法的签名上使用throws
关键字声明这些可能抛出的异常,否则编译不通过。
throws
是另一种处理异常的方式,它不同于try...catch...finally
,throws
仅仅是将函数中可能出现的异常向调用者声明,而自己则不具体处理。采取这种异常处理的原因可能是:方法本身不知道如何处理这样的异常,或者说让调用者处理更好,调用者需要为可能发生的异常负责。
throw
(一定抛出)
在 Java 中,当程序发生异常时,可以使用throw
关键字来手动抛出异常对象。throw
语句的格式为:
throw new 异常类名称(构造函数参数);
其中,异常类名称就是已定义的异常类,构造函数参数是为异常类的构造函数提供的参数。它可以为代码中的某个条件设置一个异常,并在需要的位置进行捕获和处理。
//例子
public void checkAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
}
自定义异常:在实际项目中,可以根据业务逻辑需求创建自定义异常,以便于更细致的错误分类和捕获。自定义异常类通常继承
Exception
或RuntimeException
。异常定义好后,我们就可以new出异常对象,并用throw
关键字来主动抛出异常。
throws
(提醒,可能抛出)
throws
关键字用于指定方法可能抛出的异常。它标识了哪些异常可以传递到方法的调用者,需要调用者进行相应的处理;当不希望在当前方法中捕获异常,并且希望将异常传递给上层调用者来处理时,可以使用throws
关键字。其格式如下:
修饰符 返回类型 方法名(参数列表) throws 异常列表 {
// 方法体
}
//例子
public void readFile(String filename) throws FileNotFoundException {
File file = new File(filename);
FileInputStream stream = new FileInputStream(file);
// ...
}
参考博客
一次搞懂Java异常处理(超详细!!!)!
Java中的异常有哪几类?
Java基础语法(十三):throw和throws