2026-01-02 07:27:39
Java异常架构以Throwable为顶层父类,分为Error和Exception两大分支,其中Exception又细分为运行时异常(RuntimeException及其子类)和编译时异常(Checked Exception);异常处理通过try、catch、finally、throw、throws五个关键字实现,核心目标是分离正常代码与错误处理逻辑,提升程序健壮性。
一、Java异常架构详解所有错误与异常的超类,包含线程堆栈快照信息,提供printStackTrace()等方法用于获取异常堆栈。
两个直接子类:Error(错误)和Exception(异常)。

Error(错误)
定义:JVM无法处理的严重错误,如OutOfMemoryError(内存不足)、StackOverflowError(栈溢出)。
特点:
非代码性错误,通常由JVM或系统资源问题引发。
不受检异常,程序无需捕获或处理,JVM会直接终止线程。
禁止自定义Error子类(Java惯例)。
Exception(异常)
定义:程序可捕获并处理的异常,分为运行时异常和编译时异常。
运行时异常(RuntimeException及其子类):
特点:
非受检异常,编译器不强制处理(如NullPointerException、ArrayIndexOutOfBoundsException)。
通常由程序逻辑错误引发(如空指针、数组越界)。
可通过try-catch捕获或throws声明抛出,但建议通过修改代码避免(如检查除数是否为零)。
示例:
try { int i = 10 / 0; // 抛出ArithmeticException} catch (ArithmeticException e) { e.printStackTrace();}编译时异常(Checked Exception):
特点:
受检异常,编译器强制处理(如IOException、ClassNotFoundException)。
必须通过try-catch捕获或throws声明抛出,否则编译失败。
示例:
try { FileInputStream file = new FileInputStream("nonexistent.txt"); // 抛出FileNotFoundException} catch (IOException e) { e.printStackTrace();}受检异常 vs 非受检异常
受检异常:
包括所有Exception子类(除RuntimeException外)。
编译器强制处理,符合预期的异常场景(如文件读取失败)。
非受检异常:
包括RuntimeException和Error。
编译器不检查,通常由代码错误引发(如空指针)。
try
用于包裹可能抛出异常的代码块。
示例:
try { int[] arr = {1, 2}; System.out.println(arr[3]); // 抛出ArrayIndexOutOfBoundsException} catch (Exception e) { e.printStackTrace();}catch
捕获并处理try块中抛出的异常,可定义多个catch块处理不同异常类型。
示例:
try { // 可能抛出多种异常的代码} catch (ArithmeticException e) { System.out.println("算术异常: " + e.getMessage());} catch (IOException e) { System.out.println("IO异常: " + e.getMessage());}finally
无论是否发生异常,finally块中的代码总会执行,常用于资源释放(如关闭文件、数据库连接)。
示例:
FileInputStream file = null;try { file = new FileInputStream("test.txt");} catch (IOException e) { e.printStackTrace();} finally { if (file != null) { try { file.close(); // 确保资源释放 } catch (IOException e) { e.printStackTrace(); } }}throw
主动抛出异常对象(如自定义异常或捕获后重新抛出)。
示例:
if (age < 0) { throw new IllegalArgumentException("年龄不能为负数");}throws
在方法签名中声明可能抛出的异常类型,将异常处理责任交给调用方。
示例:
public void readFile() throws IOException { FileInputStream file = new FileInputStream("test.txt"); // 读取文件操作 file.close();}区分异常类型:
运行时异常:通过代码逻辑避免(如参数校验)。
编译时异常:明确处理或向上传递(如文件操作)。
避免空catch块:
至少记录异常信息(如e.printStackTrace()),否则可能掩盖问题。
资源管理:
使用try-with-resources自动关闭资源(Java 7+):
try (FileInputStream file = new FileInputStream("test.txt")) { // 自动调用file.close()} catch (IOException e) { e.printStackTrace();}自定义异常:
继承Exception或RuntimeException,提供更清晰的错误信息。
示例:
class MyException extends Exception { public MyException(String message) { super(message); }}通过理解异常架构和合理使用关键字,程序员可以编写出更健壮、易维护的Java代码。