【Java面试笔记:基础】2.Exception和Error有什么区别?

1. Exception 和 Error 的区别

继承关系:Exception 和 Error 都继承自 Throwable 类,这是 Java 中唯一可以被抛出(throw)或捕获(catch)的类型。

Exception:
定义:表示程序正常运行中可以预料的意外情况,通常是可以被捕获并处理的。
分类
- 可检查异常(Checked Exception):在编译期必须显式捕获或声明抛出,例如 IOException。
- 不检查异常(Unchecked Exception):运行时异常,通常是逻辑错误,如 NullPointerException、ArrayIndexOutOfBoundsException,编译器不会强制要求捕获。

示例代码:

// 检查型异常必须处理
try {
    FileInputStream file = new FileInputStream("missing.txt");
} catch (FileNotFoundException e) {
    System.out.println("文件未找到");
}

// 非检查型异常(无需强制处理)
String str = null;
System.out.println(str.length()); // 抛出 NullPointerException

Error:
定义:表示程序运行中不正常的情况,通常是不可恢复的,如 OutOfMemoryError、StackOverflowError。
特点:不建议捕获,因为这些错误通常表示系统资源耗尽或运行环境异常。

示例场景:

// 递归调用导致栈溢出(StackOverflowError)
public static void infiniteRecursion() {
    infiniteRecursion();
}
public static void main(String[] args) {
    infiniteRecursion(); // 抛出 StackOverflowError
}

一句话总结:
Exception是程序可以处理的异常,Error是程序无法处理的严重错误!

2. 异常处理机制

  • try-catch-finally:Java 提供的基本异常处理结构,用于捕获和处理异常。
  • throw 和 throws:throw 用于抛出异常实例,throws 用于声明方法可能抛出的异常。
  • try-with-resources:Java 7 引入的特性,用于自动管理资源,确保资源在 try 块执行完毕后自动关闭。
  • multiple catch:Java 7 引入的特性,允许在同一个 catch 块中捕获多个异常类型。

3. 异常处理的最佳实践

  • 避免捕获通用异常:尽量捕获具体的异常类型,而不是通用的 Exception,以避免隐藏潜在问题。
  • 不生吞异常:捕获异常后应进行适当处理,如记录日志或重新抛出,而不是简单地忽略。
  • Throw early, catch late:尽早抛出异常,以便在问题发生时及时定位;在高层捕获异常,以便进行统一处理。
  • 自定义异常:根据需要自定义异常类型,但需注意避免包含敏感信息,以防止安全问题。

4. 异常处理的性能开销

  • try-catch 的性能开销:try-catch 代码块会影响 JVM 的优化,建议仅捕获必要的代码段。
  • 异常实例化开销:每次实例化 Exception 都会对当前栈进行快照,这是一个相对昂贵的操作,频繁抛出异常会影响性能。

5. 不同编程范式对异常处理的影响

  • 同步编程:异常处理相对直观,通常通过 try-catch 块捕获和处理异常。
  • 异步编程:如反应式编程(Reactive Stream),异常处理需要特别小心,因为堆栈不再是同步调用的垂直结构。建议使用 traceId 或类似机制串联日志,以便跟踪异常。

6. 常见问题和解决方案

  • 捕获通用异常:避免捕获 Exception 或 Throwable,而是捕获具体的异常类型。
  • 生吞异常:避免在捕获异常后不进行任何处理,如 e.printStackTrace(),而应记录到日志系统。
  • 异常处理策略:在异步编程中,建议使用框架提供的异常处理机制,如 CompletableFuture 或 Mono 的异常处理方法。

7. 核心对比总结

场景ExceptionError
是否可恢复程序可能恢复程序无法恢复
处理方式捕获并处理(检查型)或修复代码(非检查型)无法处理,需优化代码或调整环境
开发者责任需要主动处理异常逻辑避免错误发生(如内存泄漏)
常见子类IOException, SQLException, RuntimeExceptionOutOfMemoryError, StackOverflowError

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值