问题思考
相同点:
JAVA中的Exception和Error都是继承throwable类,在JAVA中继承了throwable类的实例才可以被抛出和捕获,它是异常的基本组成类型。
不同点:
Exception异常指程序运行过程中,可以预料的意外情况,可能并且应该被捕获,可以进行相应处理;
Error异常指在在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常指程序中需要进行显示捕获并处理,在文件编译时编译器也会进行检查。不检查异常指程序运行过程中的异常,我们经常遇到的 NullPointerException、ArrayIndexOutOfBoundsException之类,可以通过编码进行避免,或者捕获处理。
知识拓展
NoClassDefFoundError和ClassNotFoundException区别,参考文章:https://my.oschina.net/jasonultimate/blog/166932
异常处理时注意两个基本原则:
第一,尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定异常。
第二,不要生吞异常。会导致错误无法追踪
Java的异常处理机制从性能上的影响:
1.try-catch代码段会产生额外的性能开销,或者换个角度说,它往往会影响JVM对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的try包住整段的代码;与此同时,利用异常控制代码流程,也不是一个好主意,远比我们通常意义上的条件语句(if/else、switch)要低效。
2.Java每实例化一个Exception,都会对当时的栈进行快照,这是一个相对比较重的操作。如果发生的非常频繁,这个开销就不能被忽略了。