编辑
2025-03-04
Java
00
请注意,本文编写于 44 天前,最后修改于 44 天前,其中某些信息可能已经过时。

目录

Java 异常处理与异常体系详解
一、异常体系结构
二、异常处理机制
三、自定义异常
四、Java 7+ 新特性
五、最佳实践
六、常见问题

Java 异常处理与异常体系详解

一、异常体系结构

Java 的异常体系基于 Throwable 类,分为 ErrorException 两大类。

  1. Error • 表示严重问题,通常与程序逻辑无关,如内存耗尽(OutOfMemoryError)、栈溢出(StackOverflowError)等。 • 无需处理:程序一般无法恢复,只能终止运行。

  2. Exception • 程序可处理的异常,分为两类: ◦ Checked Exception(受检异常):编译时强制检查的异常,如 IOExceptionSQLException。必须通过 try-catch 处理或 throws 声明抛出。 ◦ Unchecked Exception(非受检异常):即 RuntimeException 及其子类,如 NullPointerExceptionArrayIndexOutOfBoundsException。通常由编程错误导致,不强制处理。

plaintext
Throwable ├── Error │ ├── OutOfMemoryError │ └── StackOverflowError └── Exception ├── Checked Exceptions(如 IOException) └── RuntimeException(如 NullPointerException)

二、异常处理机制

  1. try-catch-finallytry:包裹可能抛出异常的代码。 • catch:捕获并处理特定异常,可多个 catch 块。 • finally:无论是否发生异常,最终执行的代码(如释放资源)。
java
try { FileInputStream fis = new FileInputStream("file.txt"); } catch (FileNotFoundException e) { System.out.println("文件未找到"); } catch (IOException e) { e.printStackTrace(); } finally { // 清理资源 }
  1. throws 关键字 • 方法声明时使用,将异常抛给调用者处理。
java
public void readFile() throws FileNotFoundException { // 可能抛出 FileNotFoundException }
  1. throw 关键字 • 手动抛出异常实例。
java
if (input < 0) { throw new IllegalArgumentException("输入不能为负数"); }

三、自定义异常

  1. 创建步骤 • 继承 Exception(Checked)或 RuntimeException(Unchecked)。 • 提供构造方法(建议包含无参和带消息的构造)。
java
public class MyException extends RuntimeException { public MyException(String message) { super(message); } }
  1. 使用场景 • 业务逻辑错误(如余额不足、参数非法)。
java
if (balance < amount) { throw new InsufficientBalanceException("余额不足"); }

四、Java 7+ 新特性

  1. 多重捕获 • 一个 catch 块捕获多个异常,用 | 分隔。
java
try { // 可能抛出多种异常 } catch (IOException | SQLException e) { e.printStackTrace(); }
  1. try-with-resources • 自动关闭资源(需实现 AutoCloseable 接口)。
java
try (FileInputStream fis = new FileInputStream("file.txt")) { // 使用资源 } catch (IOException e) { e.printStackTrace(); }

五、最佳实践

  1. 避免空 catch 块:忽略异常可能导致隐藏的 Bug。
  2. 优先处理具体异常:通用的 Exception 可能掩盖问题。
  3. 合理使用异常类型: • 业务错误用 Checked Exception(强制调用方处理)。 • 程序逻辑错误用 Unchecked Exception(如参数校验失败)。
  4. 利用异常链:保留原始异常信息,便于追踪。
java
try { // 代码逻辑 } catch (ServiceException e) { throw new BusinessException("业务失败", e); // 传递原始异常 }

六、常见问题

性能影响:异常处理较慢,避免用于控制流程。 • 打印堆栈e.printStackTrace() 或日志框架记录。 • 覆盖方法异常:子类方法抛出的异常不能比父类更宽泛。


通过理解异常体系和合理使用处理机制,可以编写更健壮、易维护的 Java 代码。

本文作者:宁小健

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!