在 Java 中,异常(Exception)是指程序运行过程中可能遇到的错误或异常情况。
以下是java体系中异常的继承关系
Throwable是所有异常的超类,下分Error和Exception。
Error
Error表示严重的问题,通常由虚拟机自身出现。通常无法通过程序本身来恢复或处理,因为这些问题已经超出了程序本身的控制范围。一般情况下,不建议程序捕获和处理 Error,而是应该尽量预防这类问题的发生,或者在遇到时让程序自然地终止。常见的Error有
- OutOfMemoryError:内存溢出。
- StackOverflowError:栈溢出。
- NoClassDefFoundError:无法找到所需的类定义
Exception
Exception是程序正常运行中可以预料到的问题,通常由程序本身逻辑或外部条件引起。可以通过捕获和处理来使程序继续执行,或采取适当的措施进行恢复。根据异常的特性和使用场景,异常又可以分为两大类:
受检异常(Checked Exception)
这类异常在编译时就需要进行处理,即要求程序员在代码中显式地捕获或声明可能抛出的受检异常。像在进行流操作是要处理IOException,在数据库操作时需要处理SQLException,线程操作时需要处理InterruptedException。这些异常通常与外部资源交互有关,比如文件操作、网络操作、数据库操作等。
非受检异常(Unchecked Exception)
也称为运行时异常(Runtime Exception),这类异常在编译时不强制要求进行处理,可以选择性地捕获和处理。这些异常通常与程序逻辑有关,也是和开发者比较相关的。像经常遇到的一些异常:
1、NullPointerException 空指针
2、ArrayIndexOutOfBoundsException 数组下标越界
3、IllegalArgumentException 参数不合法
4、ArithmeticException 算数运算异常
根据异常分类,可以有针对性地进行异常处理,保障程序的稳定性和可靠性。在实际开发中,需要根据具体的业务逻辑和需求,合理处理各种类型的异常。
自定义异常
jdk中已经定义了很多常见的异常,但是在系统开发的时候一般还是会自定义一些与业务相关的异常,用来区分不同的业务场景,使错误更明确。特别是在进行接口开发时。
自定义异常一般需要继承Exception类。Exception有一个Exception(String message)构造函数可以指定错误异常。当然也可以自定义异常属性用来标识一些信息,最常见的是添加状态码值。
public class MyExcepton extends Exception {
public MyExcepton(String message){
super(message);
}
}
异常的使用和处理
定义好异常后就可以在一些条件下来明确使用异常,抛出异常使用throw关键字
if(1 == 1)
throw new MyExcepton("条件不满足");
使用throw抛出的异常,这里就是一种受检查异常,在被调用地方必须要进行代码显示的处理异常。
处理异常可以使用try-catch-finally块来。
catch块会捕获对应的异常,可以获取异常的相关信息
try {
Thread.sleep(11);
} catch (InterruptedException e) {
e.printStackTrace();
e.getMessage();
System.out.println(e.toString());
}
printStackTrace():打印异常的堆栈信息,也就是方法调用链
getMessage():异常的描述信息
toString():包括异常类名和异常描述信息
另外finally块是对异常的兜底操作,无论try块中是否发生异常,finally块中语句都会在整个try-catch-finally代码块部分最后被执行到。可以用于一些资源的释放等操作。
如果不想在当前代码块进行处理异常,可以将异常继续抛出到方法签名上,由调用该方法 的地方进行处理,方法异常抛出使用throws关键字,可以指定多个。
public void m1() throws InterruptedException, FileNotFoundException {
Thread.sleep(1);
File file = new File(("a.txt"));
new FileInputStream(file);
}
参考:
https://docs.oracle.com/javase/tutorial/essential/exceptions/index.html
https://www.geeksforgeeks.org/exceptions-in-java/