Java 异常处理:从原理到实战最佳实践
前言:为什么我们需要异常处理?
在开发过程中,程序运行出现非正常情况是不可避免的。无论是文件找不到、数组越界还是空指针访问,这些都会中断流程。Java 的异常处理机制本质上就是捕获并处理这些非正常情况,保证程序要么优雅退出,要么继续运行。
本章我们将深入理解异常体系,掌握核心语法,并重点讨论如何在实际项目中落地最佳实践。
异常体系:Throwable 家族
Java 中所有异常都是 Throwable 类的子类。理解这个继承关系是基础:
- Error(错误):JVM 内部的严重错误,属于不可恢复的异常。比如
OutOfMemoryError(内存溢出)或StackOverflowError(栈溢出)。这类问题通常无法通过代码处理,需要优化环境或逻辑。 - Exception(异常):程序本身可以处理的异常情况。
- Checked Exception(受检异常):编译器强制要求处理的异常,如
IOException、SQLException。处理方式是用try-catch捕获或用throws声明抛出。 - Unchecked Exception(非受检异常):继承自
RuntimeException,编译器不强制处理。常见的有NullPointerException、ArrayIndexOutOfBoundsException。这类通常是逻辑错误,建议通过规范代码来避免,而不是依赖捕获。
- Checked Exception(受检异常):编译器强制要求处理的异常,如
示例:递归导致的栈溢出
public class ErrorDemo {
public static void recursion() {
recursion(); // 无限递归
}
public static void main(String[] args) {
recursion(); // 抛出 StackOverflowError
}
}
核心语法实战
try-catch:捕获与处理
这是最基础的异常处理结构。try 包裹可能出错的代码,catch 负责处理特定类型的异常。
捕获单个异常
以空指针为例,演示如何安全地处理:
public class TryCatchSingleDemo {
public static void {
;
{
System.out.println(str.length());
} (NullPointerException e) {
System.out.println( + e.getMessage());
e.printStackTrace();
}
System.out.println();
}
}


