第5章:异常
5.1 异常概述
定义:异常是指程序执行过程中发生的意外事件,可能会导致程序中断正常流程。
异常与错误:
-
异常(Exception):通常是可以预见和处理的问题,如文件找不到、网络连接失败等。Java中的异常分为两类:
- 受检异常(Checked Exceptions):编译器要求必须处理的异常,如
IOException、SQLException等。 - 非受检异常(Unchecked Exceptions):通常是由于程序逻辑错误引起的,如
NullPointerException、ArrayIndexOutOfBoundsException等。这些异常继承自RuntimeException类,不需要强制处理。
- 受检异常(Checked Exceptions):编译器要求必须处理的异常,如
-
错误(Error):
-
表示严重的系统级问题,如
OutOfMemoryError、StackOverflowError等,通常是不可恢复的,不应尝试捕获。所有的异常类都直接或间接继承自Throwable类。 Exception类用于用户可以恢复的异常情况。- 常见异常示例:
ArithmeticException:除以零等算术运算错误。 ArrayIndexOutOfBoundsException:数组索引超出范围。ClassCastException:非法类型转换。IllegalArgumentException:传递给方法的参数不合法。NullPointerException:试图访问空对象的成员或调用其方法。
5.2 异常处理
-
抛出异常:
- 使用
throw关键字手动抛出一个异常对象,可以是任何实现了Throwable接口的类的实例。 - 示例
-
if (value < 0) { throw new IllegalArgumentException("Value cannot be negative"); }
声明异常:
- 使用
throws关键字声明一个方法可能抛出的异常,告知调用者需要处理这些异常。 - 示例
-
public void readFile(String path) throws IOException { // 文件读取操作 }捕获异常:
-
try-catch块: -
try语句用于包裹可能抛出异常的代码段。 -
catch语句用于捕获并处理特定类型的异常。 - 多重
catch块: - 可以有多个
catch块来处理不同类型的异常,按照从具体到一般的顺序排列,确保更具体的异常优先被捕获。
5.3 异常进阶
-
自定义异常:
- 创建自己的异常类,通常继承自
Exception或RuntimeException,以便更好地描述特定业务逻辑中的异常情况。 - 示例:
-
public class InsufficientFundsException extends Exception { public InsufficientFundsException(String message) { super(message); } }方法重写中的异常:
- 在子类中重写父类的方法时,子类方法不能抛出比父类方法更多的异常类型。
- 子类方法可以抛出更少或相同类型的异常,或者根本不抛出异常。
- 示例
-
class Parent { void method() throws IOException { // 方法实现 } } class Child extends Parent { @Override void method() throws FileNotFoundException { // 更具体的异常 // 方法实现 } }异常链(Chained Exceptions):
- 使用构造函数
Throwable(Throwable cause)或initCause(Throwable cause)方法将一个异常与另一个关联起来,有助于调试时追踪根本原因。 - 示例:
-
try { // 某些可能抛出异常的操作 } catch (IOException e) { throw new MyCustomException("An error occurred", e); }学习心得
自定义异常使得代码更具表达力,可以更清晰地传达业务逻辑中的异常情况。方法重写中的异常规则确保了API的一致性和安全性,防止子类引入新的异常类型破坏调用者的期望
遇到的难点及解决方法
-
难点:理解方法重写中的异常规则,特别是如何平衡父类和子类之间的异常声明。
-
解决方法:仔细研究Java语言规范中关于方法重写的规则,并通过实际编码练习来巩固理解。创建一些简单的继承关系,并尝试重写方法,观察编译器对异常声明的要求。
-

浙公网安备 33010602011771号