当前位置: 首页 > 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

http://www.xdnf.cn/news/55891.html

相关文章:

  • XSS详解
  • 神经网络直接逆控制:神经网络与控制的结合入门级结合
  • 树莓派超全系列教程文档--(38)config.txt视频配置
  • SpringBoot中PDF处理完全指南
  • JVM学习
  • 【Linux网络】构建UDP服务器与字典翻译系统
  • 完美解决Microsoft Edge浏览器无法同步/一直在同步中/更新失败等问题
  • 后端如何生成验证码
  • 4U带屏基于DSP/ARM+FPGA+AI的电力故障录波装置设计方案,支持全国产化
  • 解析三大中间件:Nginx、Apache与Tomcat
  • 【KWDB 创作者计划】_本地化部署与使用KWDB 深度实践
  • ASP.NET Core 分层项目中EFCore的使用
  • Linux下 REEF3D及DIVEMesh 源码编译安装及使用
  • CGAL 计算直线之间的距离(3D)
  • 红队专题-漏洞挖掘-代码审计-反序列化
  • C++初阶的应用-日期管理系统的设计与实现
  • SSM--事务
  • 【TeamFlow】4 团队管理系统
  • 卡洛诗以“中式西餐”为锚点
  • C++运算符重载详解
  • puzzle(0531)脑力航迹
  • 【计量地理学】实验八 土壤重金属Zn污染范围的界定与不确定性分析
  • SpringCloud
  • 火箭姿态控制系统
  • RV1126网络环境TFTPNFS搭建(四)
  • C++学习:六个月从基础到就业——内存管理:内存泄漏与避免
  • 一文读懂Python之numpy模块(34)
  • 02_解决Class com.sun.tools.javac.tree.JCTree
  • STM32基础教程——HEX数据包接收
  • 域名解析,配置Linux系统的固定IP地址