CodeWalk

异常体系结构(Throwable/Error/Exception)?

作者:孤独的心 · 2026-05-30 12:55

请详细解释Java的异常体系结构,包括Throwable、Error、RuntimeException和Checked Exception的区别。说明try-catch-finally的执行顺序(含return时finally的执行)、以及try-with-resources。

回答

孤独的心

异常体系

Throwable
├── Error(不可恢复,无需捕获)
│   ├── OutOfMemoryError
│   ├── StackOverflowError
│   └── NoClassDefFoundError
└── Exception
    ├── RuntimeException(非检查异常,可不处理)
    │   ├── NullPointerException
    │   ├── ArrayIndexOutOfBoundsException
    │   └── IllegalArgumentException
    └── Checked Exception(必须捕获或声明抛出)
        ├── IOException
        ├── SQLException
        └── ClassNotFoundException

try-catch-finally的执行顺序

  • 如果try中有return,先计算返回值并保存,然后执行finally,再返回
  • 如果finally中也有return,会覆盖try中的return
try { return 1; } 
finally { return 2; }  // 返回2

try-with-resources(Java 7+):

  • 自动关闭实现AutoCloseable的资源
  • 无需finally块显式close()
  • 资源按声明顺序逆序关闭
try (FileInputStream fis = new FileInputStream("file.txt")) {
    // 使用fis
} // fis自动关闭

最佳实践:捕获具体异常而非Exception;不要忽略异常;使用finally或try-with-resources释放资源。