Exception和Error的区别-《Java核心技术》笔记

Exception是程序正常运行时可以预料到并且应该被捕获的情况,Error是指在正常情况下不太可能出现的情况。绝大部分Error都会导致程序处于非正常、不可恢复的情况,所以不便于也不应该被捕获,比如OutofMemoryError。Exception分为checked和unchecked,checked在代码里必须显式捕获,比如IOException,而unchecked是不可查异常,比如NullPointerException、ArrayIndexOutOfBoundException,通常是可以编码避免的逻辑错误。
accba531a365e6ae39614ebfa3273900

抛异常的最佳实践:throw early,catch late。

try-catch会产生额外的性能开销,建议仅捕获有必要的代码段,不要一个大的try包住整段代码。

java每实例化一个Exception都会进行栈快照,有种优化方式是尝试创建不进行栈快照的Exception。

NoClassDefFoundError和ClassNotFoundException的区别:

  • java在使用反射机制加载类(例如Class.forName)的时候,将类名作为参数传递给上诉方法从而将指定类加载到JVM中,如果这个类在路径中没找到,则会在运行时抛ClassNotFoundException;
  • 如果JVM或ClassLoader实例尝试加载类的时候找不到类定义,要查找的类在编译时存在,但在运行时不存在,则会抛NoClassDefFoundError,可能的原因是jar包损伤或被篡改。

区别

ClassNotFoundException NoClassDefFoundError
从java.lang.Exception继承,是一个Exception类型 从java.lang.Error继承,是一个Error类型
当动态加载Class的时候找不到类会抛出该异常 当编译成功以后执行过程中Class找不到导致抛出该错误
一般在执行Class.forName()、ClassLoader.loadClass()或ClassLoader.findSystemClass()的时候抛出 由JVM的运行时系统抛出
comments powered by Disqus