当前位置: 首页 > news >正文

【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

相关文章:

  • 海外版高端Apple科技汽车共享投资理财系统
  • qt 配置 mysql 驱动问题:Cannot load library qsqlmysql;QMYSQL driver not loaded
  • 分布式光纤测温技术让森林火灾预警快人一步
  • iFable,AI角色扮演互动平台,自动生成沉浸式故事游戏
  • AI之pdf解析:Tesseract、PaddleOCR、RapidPaddle(可能为 RapidOCR)和 plumberpdf 的对比分析及使用建议
  • 2025年首届人形机器人半程马拉松比赛(附机器人照片)
  • 【大模型】Browser-Use AI驱动的浏览器自动化工具
  • Kotlin安卓算法总结
  • Kotlin基础(①)
  • 速通FlinkCDC3.0
  • MongoDB数据库的安装到入门使用详细讲解
  • HTTP 和 HTTPS 有什么区别?
  • 负载均衡与实时调度—LSF
  • 解决Mac 安装 PyICU 依赖失败
  • Centos9 安装 nginx 及配置
  • 【React】搜索时高亮被搜索选中的文案
  • 算法工程师面试题与参考答案资料(2025年版)
  • C++算法(10):二叉树的高度与深度,(C++代码实战)
  • Java 泛型使用教程
  • Netty前置基础知识之BIO、NIO以及AIO理论详细解析和实战案例
  • 中印尼“2+2”:中国周边外交的范式突破与东南亚棋局重构
  • 中小企业收款难何解?快速认定企业身份并理顺付款责任链条
  • 服务业扩大开放,金融、医疗等多领域明确155项试点任务
  • 印度空军计划增购40架法制“阵风”战机,此前已购买36架
  • 《大家聊中国式现代化》明天全网推出
  • 2025中国互联网企业家座谈会在京召开