精通 Java 异常处理:try-catch、finally 与类层级详解
什么是 Java 异常?
Java 异常 是中断程序指令执行、破坏正常控制流的事件。它是封装方法内错误信息的对象,传递给运行时系统。Java 中异常主要标示标准控制流无法处理的各种错误条件。
本教程学习:
- 异常是什么
- 为什么异常重要
- 如何有效处理
- try-catch 结构
- Java 异常类层级
- finally 块的作用
Java 错误分两大类:
- 编译时错误
- 运行时错误
编译时错误细分:
- 语法错误
- 语义错误
语法错误示例:
声明 int a; 正确,写 in a; 编译器报错。
同一作用域内声明 int a; 后再次声明 int a; 触发编译错误,构建时高亮显示。
运行时错误示例
运行时错误表现为异常,中断正常执行流。典型如 ArithmeticException、NullPointerException、除零错误。
这些异常源于开发者无法直接控制的条件。

为什么需要异常处理?
考虑访问远程服务器的程序。开发时服务器可达,代码顺利运行。生产环境服务器可能宕机,尝试连接时抛出异常。

仅依赖代码自然流程不足。健壮程序须预判异常并优雅恢复。
如何处理异常
异常处理是预判异常条件并提供回退逻辑的实践。常见策略:尝试主操作,失败则切换备用。

用传统 if-else 处理多异常类型很快变得笨重:
class Connect { if (serverIsUp()) { // 连接主服务器 } else { // 连接备用服务器 } }
try-catch 块
Java 提供内置异常处理机制。可能抛出异常的代码放入 try 块,对应恢复代码放入一个或多个 catch 块。

例如 try 块尝试连主服务器,catch 块处理回退逻辑。
服务器正常时跳过 catch;宕机时抛出异常,执行 catch 块。

try-catch 语法:
try { // 可能抛异常的语句 } catch (ExceptionType name) { // 恢复语句 }
实战示例
步骤 1:复制代码到 IDE。
class JavaException { public static void main(String args[]) { int d = 0; int n = 20; int fraction = n / d; // 抛出 ArithmeticException System.out.println("End Of Main"); } }
步骤 2:编译运行。程序抛出 ArithmeticException 并在第 5 行终止。
步骤 3:修改代码使用 try-catch:
class JavaException { public static void main(String args[]) { int d = 0; int n = 20; try { int fraction = n / d; System.out.println("This line will not be executed"); } catch (ArithmeticException e) { System.out.println("Caught exception: " + e); } System.out.println("End Of Main"); } }
步骤 4:再次编译运行。输出显示异常被优雅处理,程序继续执行最终打印。

捕获的 ArithmeticException 对象 e 包含详细信息,可用于日志或恢复。
异常类层级
Java 异常层级源于 Throwable 类,两个直接子类:Error 和 Exception。Error 表示不可恢复状况(如 OutOfMemoryError),Exception 覆盖可程序化处理的条件。

- RuntimeException(如 NullPointerException、ArithmeticException)—— 非受检异常,编译期不检测。
- IOException —— 输入/输出操作问题。
- InterruptedException —— 线程被中断时抛出。
嵌套 try-catch 示例
复制以下代码:
class JavaException { public static void main(String args[]) { try { int d = 1; int n = 20; int fraction = n / d; int g[] = {1}; g[20] = 100; // ArrayIndexOutOfBoundsException } catch (ArithmeticException e) { System.out.println("Caught ArithmeticException: " + e); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Caught ArrayIndexOutOfBoundsException: " + e); } System.out.println("End Of Main"); } }
d 为 1 时抛出 ArrayIndexOutOfBoundsException。改 d 为 0 触发 ArithmeticException。取消注释宽泛 catch (Exception e) 会导致编译错误,因它遮蔽更具体处理器。
finally 块
finally 块无论是否发生异常都执行,适合清理任务。
try { // 危险操作 } catch (ExceptionType e) { // 错误处理 } finally { // 清理动作 }
示例:
class JavaException { public static void main(String args[]) { try { int d = 0; int n = 20; int fraction = n / d; } catch (ArithmeticException e) { System.out.println("Caught exception: " + e); } finally { System.out.println("Inside the finally block"); } } }
运行程序输出 finally 块消息即使抛出异常。改 d 为 1 消除异常;finally 块仍运行。
总结:
- 异常 是中断正常程序流的运行时错误。
- 错误分编译时(语法、语义)和运行时(异常)。
- 健壮应用须处理所有预期异常以保稳定性。
- Java try-catch 机制是拦截恢复错误的标准方式。
try放可能抛异常代码;catch处理错误;finally保证清理。
java
- C++ 异常处理实战:try、catch、throw 完整指南与示例
- C# 异常处理完全指南:try-catch-finally、异常类型、自定义异常与最佳实践
- 精通 Python 异常处理:try、except、else 与 finally 详解
- 精通 Python 异常处理:try、except、finally 与 raise 高效用法
- 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解
- 精通 Java 异常处理:try-catch-finally 与资源管理
- 精通 Java 多异常捕获:单 catch 块处理多异常
- Java String.charAt() 详解:语法、返回类型、异常与实战示例
- 精通 Java String.endsWith():检查字符串后缀(示例)
- Java BufferedReader 读取文件:实战指南与示例
- Java 插入排序算法详解:核心原理、完整代码与步骤演示
- Java 9 try-with-resources 改进:Effectively-final 变量直接使用