共同点
都是从 Throwable 这个 Java 类继承来的。Throwable 类也就衍生出这两种类型。
不同点
Error:
表示编译时和系统错误,指在正常情况下,不大可能出现的情况。绝大部分的 Error 都会导致程序不可恢复。
Exception:
是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,并进行相应的处理。
Exception 又分为检查型异常 (check exception) 与 非检查型异常 (unchecked exception) 。检查型异常是在编译期检查,非检查型异常就是运行时异常。运行时异常都是从 RuntimeException 继承来的,这种异常属于错误,将被自动捕获。
补充
1、理解 Throwable、Exception、Error 的设计和分类。
面试官会追问一些细节,如:你了解哪些 Error、Exception、RuntimeException? 重点了解一下常用的子类。
经典问题:NoClassDefFoundError 与 ClassNotFoundException的区别。
NoClassDefFoundError 产生原因:如果 JVM 或者 ClassLoader 实例尝试加载类的时候却找不到类的定义,要查找的类在编译期存在,运行时却找不到,造成该问题的原因可能是打包过程露掉了部分类,或者 jar 包出现损坏或者篡改。
ClassNotFoundException产生原因:1.Java 支持反射方式在运行时动态加载类,例如使用 Class.forName() 方法来动态的加载类时,可以将类名作为参数传递到上述方法中,从而将指定类加载到 JVM 内存中,如果这个类在类路径中没有被找到,就会抛出这个错误。常见问题在于书写名错误;2.当一个类已经被某个类加载器加载到内存中了,另一个类加载器又尝试着动态的从同一个包中加载这个类。通过控制动态类加载过程可以解决这个问题。
2、理解 Java 语言中操作 Throwable 的元素和实践。
掌握最基本的语法同时也要懂得如何处理典型场景。
典型场景是什么呢?待补充
异常处理基本原则
1.尽量不要捕获类似 Exception 这样的通用异常,应该捕获特定异常。
这样写为了让自己代码能够体现出更多的信息。
2.不要生吞异常。
在工作中,如果发生异常,不要使用 e.printStackTrace() 来输出异常,因为很难判断输出到哪里去了,最好使用产品日志,详细的输入到日志系统中。