异常体系结构(Throwable/Error/Exception)?
请详细解释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释放资源。