【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. 核心对比总结
场景 | Exception | Error |
---|---|---|
是否可恢复 | 程序可能恢复 | 程序无法恢复 |
处理方式 | 捕获并处理(检查型)或修复代码(非检查型) | 无法处理,需优化代码或调整环境 |
开发者责任 | 需要主动处理异常逻辑 | 避免错误发生(如内存泄漏) |
常见子类 | IOException , SQLException , RuntimeException | OutOfMemoryError , StackOverflowError |