摘要:本文学习了如何处理代码中的异常。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
1 定义
异常是指在运行时期发生的不正常情况。
如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序正常的执行。
2 分类
异常使用Exception类表示,其父类Throwable有两个子类:
- Exception是人为造成的错误,是可以避免和处理的错误。又分为ChickException受检异常和RuntimeException非受检异常。
- Error是指严重的错误,比如内存不足,是无法避免和解决的致命错误。
2.1 受检异常(CheckedException)
也称为编译异常,是指编译时被编译器检出的异常,在编译时就必须处理的异常。
常见情况:
- ClassNotFoundException:类未找到异常,未正确加载类导致的异常,一般发生在加载类的代码中。
- SQLException:数据库异常,一般会发生在和数据库建立连接,或者对返回结果进行处理的时候。
- IOException:文件异常,一般在读写数据的时候会出现这种问题。
- FileNotFoundException:文件不存在异常,属于IOException的子类,一般在读取文件的时候会产生异常,需要进行异常处理。
2.2 非受检异常(RuntimeException)
也称为运行时异常,是指在程序运行时出现的异常,编译时不会提示异常,所以在编译时不用处理,系统会默认打印到日志里。
常见情况:
- NullPointerException:空指针异常,最为常见的一种异常,获取值为null的对象的属性,或者通过null的对象调用了方法。
- ArrayIndexOutOfBoundsException:数组下标越界异常,获取数组的值的时候,尝试获取不在下标范围内的下标的值。
- ClassCastException:类型转换异常,尝试将两个类进行强制转换时有可能会报这个异常。
- ArithmeticException:算术异常,进行数学运算时会发生的异常。
- NumberFormatException:数字转换异常,尝试将非数字的数据类型转换为数字类型时,会报这种错误。
3 处理
3.1 捕获异常
如果需要处理异常,必须先对异常进行捕获,然后再对异常情况进行处理。
可以使用try和catch关键字对异常进行捕获,还可以使用finally保证即便在出现异常后仍能执行操作:
- try语句块包括的是可能会发生异常的代码段,执行时可能会有一种或者多种异常发生。当有异常发生时,会交给catch处理,如果没有发生异常,则略过catch语句块。
- catch语句块里需要的参数是某种异常类型,一个try代码块可能有一个或者多个catch代码块,以便对不同的异常捕获处理。
- finally语句块为异常代码提供必要的处理,只要程序在执行,无论发生了什么,最后都会执行finally里的代码。
示例:
1 | public void readFile(String name) { |
throw关键字可以在catch到相应类型的异常后,将异常重新抛出,交由上一级调用的代码处理。
示例:
1 | public void readFile(String name) { |
3.2 抛出异常
如果不想捕获和处理出现的异常,可以使用throws关键字把产生的异常抛出,交给调用方法的上一级代码处理。
示例:
1 | public void readFile(String name) throws IOException { |
如果在catch捕获之后,使用throw抛出了受检异常,同样需要使用throws关键字进行抛出处理。
示例:
1 | public void readFile(String name) throws IOException { |
4 自定义异常
4.1 创建异常
命名规则为XxxException,继承自Exception类或者其子类。
定义自定义异常的有参构造方法,调用父类的有参构造方法。
4.2 使用异常
使用throw关键字,调用自定义异常的构造方法,传入异常信息,实现抛出自定义异常。
条