Exception与Error

1. Exception与Error的区别

Exception和Error都继承了Throwable类,在Java中Throwable类型是异常处理机制的基本组成类型,只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch)。

区别如下:

① 处理上的区别:

  • Exception是程序正常运行中,可以预料的意外情况,应该被捕获,进行相应处理。

    Exception分为:

    • 可检查异常(checked): 必须显式地进行捕获处理,编译期会检查,如:IOException

    • 不检查异常(unchecked): 即运行时异常,根据需要来判断是否捕获,不会在编译期强制要求捕获,如:NullPointerException, ArrayIndexOutOfBoundsException

  • Error是在正常情况下,不太可能出现的情况,不需要捕获,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的、不可恢复状态,如:OutOfMemoryError, StackOverflowError

② 类设计上的区别:

2. 异常处理的原则及经验

① 尽量捕获特定异常,而不是类似Exception的通用异常

原因如下:

  • 捕获特定异常,能具体地体现尽量多的异常信息。
  • 保证不会捕获我们不希望捕获的异常,如希望RuntimeException被扩散出来,而不是被捕获。
  • 非特殊情况,不要捕获Throwable或Error,因为很难保证能正确程序处理OutOfMemoryError。

② 不要吞掉异常

生吞异常,而不把异常抛出来或者输出到日志中,则不能容易判断出哪里抛出了异常以及产生异常的原因。

③ 异常打印,不要使用e.printStackTrace(),不要包含敏感信息。

使用e.printStackTrace()会打印到标准错误流中,比较难判断输出到了哪里。

④ 仅捕获有必要的代码段,尽量不要一个大的try包住整段代码

try-cath代码会产生额外的性能开销,会影响JVM对代码进行优化。

相关推荐
Barcke5 分钟前
深入浅出 Spring WebFlux:从核心原理到深度实战
后端
JuiceFS6 分钟前
从 MLPerf Storage v2.0 看 AI 训练中的存储性能与扩展能力
运维·后端
大鸡腿同学8 分钟前
Think with a farmer's mindset
后端
Moonbit29 分钟前
用MoonBit开发一个C编译器
后端·编程语言·编译器
Reboot1 小时前
达梦数据库GROUP BY报错解决方法
后端
稻草人22221 小时前
java Excel 导出 ,如何实现八倍效率优化,以及代码分层,方法封装
后端·架构
渣哥1 小时前
原来 Java 里线程安全集合有这么多种
java
间彧1 小时前
Spring Boot集成Spring Security完整指南
java
掘金者阿豪2 小时前
打通KingbaseES与MyBatis:一篇详尽的Java数据持久化实践指南
前端·后端
间彧2 小时前
Spring Secutiy基本原理及工作流程
java