2.6 异常处理(try-catch-finally)
异常的概念
异常(Exception)是程序在运行过程中出现的非正常情况,它会中断程序的正常执行流程。Java通过异常处理机制提供了一种结构化和可控的方式来处理运行时错误。
异常的分类
Java中的异常分为两大类:
- Checked Exception(受检异常):编译器强制要求处理的异常(如
IOException、SQLException)。 - Unchecked Exception(非受检异常):包括运行时异常(
RuntimeException及其子类)和错误(Error及其子类),编译器不强制处理。
try-catch-finally 结构
try {
// 可能抛出异常的代码块
} catch (ExceptionType1 e1) {
// 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e2) {
// 处理 ExceptionType2 类型的异常
} finally {
// 无论是否发生异常都会执行的代码块(常用于资源释放)
}
关键点
- try块:包含可能抛出异常的代码。
- catch块:捕获并处理特定类型的异常。多个catch块时,子类异常需排在父类异常之前。
- finally块:无论是否发生异常都会执行,通常用于关闭文件、数据库连接等资源清理操作。
示例代码
public class ExceptionDemo {
public static void main(String[] args) {
try {
int result = 10 / 0; // 抛出 ArithmeticException
System.out.println("结果:" + result);
} catch (ArithmeticException e) {
System.err.println("算术异常:" + e.getMessage());
} finally {
System.out.println("finally块始终执行");
}
}
}
常见异常处理方式
- 捕获并处理:通过catch块恢复程序状态或提示用户。
- 重新抛出异常:在catch块中使用
throw将异常传递给上层调用者。 - throws声明:在方法签名中使用
throws声明可能抛出的异常。
最佳实践
- 避免空的catch块(至少记录异常日志)。
- 不要用异常处理替代常规流程控制。
- finally块中避免包含可能抛出异常的代码。
- Java 7+支持try-with-resources语法,可自动关闭实现了
AutoCloseable的资源。
自定义异常
通过继承Exception(受检异常)或RuntimeException(非受检异常)创建自定义异常类:
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
注意:异常处理是编写健壮Java程序的关键技术,合理使用可以显著提高程序的可靠性。
