参考答案
Error类和Exception类都继承自Throwable类。
Error的继承关系
java.lang.Object
java.lang.Throwable
java.lang.Error
Exception的继承关系
java.lang.Object
java.lang.Throwable
java.lang.Exception
一、概念不同
Error:程序无法处理的系统错误,编译器不做检查。
Exception:程序可以处理的异常,捕获后可能恢复。
前者是程序无法处理的错误,后者是可以处理的异常。
二、责任不同
Error:指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常状态,不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
- 可以是可被控制(checked) 或不可控制的(unchecked);
- 表示一个由程序员导致的错误;
- 应该在应用程序级被处理。
Exception:是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理。可划分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源码里必须显示的进行捕获处理,这里是编译期检查的一部分。
- 总是不可控制的(unchecked);
- 经常用来用于表示系统错误或低层资源的错误;
- 如何可能的话,应该在系统级被捕捉。
三、知识拓展
常见的Error和Exception
1. RuntimeException
- NullPropagation:空指针异常
- ClassCastException:类型强制转换异常
- IllegalArgumentException:传递非法参数异常
- IndexOutOfBoundsException:下标越界异常
- NumberFormatException:数字格式异常
2. 非RuntimeException
- ClassNotFoundException:找不到指定class的异常
- IOException:IO操作异常
3. Error
- NoClassDefFoundError:找不到class定义的异常
- StackOverflowError:深递归导致栈被耗尽而抛出的异常
- OutOfMemoryError:内存溢出异常
分析Exception和Error的区别,是从概念角度考察了java处理机制,仅处于理解的层面,面试时只要阐述清楚就可以了。
在日常编程中,如何处理好异常是比较考验功底的。我认为至少需要掌握以下两个方面:
第一,理解Throwable,Exception,Error的设计和分类,掌握日常应用最为广泛的子类,以及如何自定义异常等。很多面试官会进一步追问一些细节,比如,你了解哪些Error,Exception或者RuntimeException?面试时至少要心中有数,最好重点理解一些子类型。
第二,理解java语言中操作Throwable的元素和实践,熟练掌握最基本的语法,比如try-catch-finally块,throw,throws关键字等。同时,还要懂得如何处理典型场景。
以上,是Java面试题【Error和Exception的区别】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—