关于Exception和ERROR的通俗理解:
1)假如你开车上山,车坏了,你拿出工具箱修一修,修好继续上路(Exception被捕获,从异常中恢复,继续程序的运行);
2)车坏了,你不知道怎么修,打电话告诉修车行,告诉你是什么问题,要车行过来修。(在当前的逻辑背景下,你不知道是怎么样的处理逻辑,把异常抛出去到更高的业务层来处理)。
3)你打电话的时候,要尽量具体,不能只说我车动不了了。那修车行很难定位你的问题。(要补货特定的异常,不能捕获类似Exception的通用异常)。还有一种情况是,你开车上山,山塌了,这你还能修吗?(Error:导致你的运行环境进入不正常的状态,很难恢复)。
1.两者关联:
都是Throwable的子类。
2.不同点:
Exception:表示可恢复的异常, 又可细分为
可检查异常: 比如在代码中显示的使用try catch必行捕获的代码,或者使用throws
不可检查异常:在代码运行中才可能知道的异常,比如nullpointExcetion
ERROR:不可恢复的异常,比如内存溢出。
两者的关系类图如下:
- 如何避免:
对于Exception :在使用try catch 语句的时候,保持范围最小的原则, 因为如果发生了异常的时候,需要存储快照, 如果频繁发生异常的话, 会暂用很多内存。
此外异常的情况 ,不建议直接吞掉,应该根据实际的情况 进行打日志,通知调用方。
附常规要点:
比如 NoClassDefFoundError 和 ClassNotFoundException 有什么区别
NoClassDefFoundError 是一种 Error,Error 在大多数情况下代表无法从程序中恢复的致命错误,产生的原因在于 JVM 或者 ClassLoader 在运行时类加载器在 classpath 下找不到需要的类定义
(编译期是可以正常找到的,所以和 ClassNotFoundException 不同的是这是一个运行期的 Error),这个时候虚拟机就会抛出 NoClassDefFoundError,
通常造成该 ERROR 的原因是打包过程中漏掉了部分类,或者 jar 包出现损坏或篡改,对应的 Class 在 classpath 中不可用等等原因
ClassNotFoundException 是属于 Exception 的运行时异常,大多是可以从代码中恢复的异常类型,导致该异常的原因大多是因为使用 Class.forName() 方法动态的加载类信息,但是这个类在类路径中并没有被找到,那么就会在运行时抛出 ClassNotFoundException
如下实例: