Exception与Error有什么区别
一、基本概念
1、Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
2、Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。
Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,
比如OutOfMemoryError、NoClassDefFoundError等。
3、Exception又分为检查性异常和非检查性异常。
两个根本的区别在于,检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)。
非检查性异常 在代码编写使,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),
这种异常是在代码编写或者使用过程中通过规范可以避免发生的。 切记,Error是Throw不是Exception

二、使用场景
1、理解 Throwable、Exception、Error 的设计和分类。比如,掌握那些应用最为广泛的子类,以及如何自定义异常等。
一般在面试的情况下,都会问你,你知道Error和Exception下的子类有哪些?能说一下他们具体的应用场景?
其中有一个比较经典的面试题目, 就是 NoClassDefFoundError 和 ClassNotFoundException 有什么区别
2、理解 Java 语言中操作 Throwable 的元素和实践。掌握最基本的语法是必须的,
如 try-catch-finally 块,throw、throws 关键字等。与此同时,也要懂得如何处理典型场景。
throw是存在于方法的代码块中,而throws是存在于方法外围,一般是在方法名后边 throws XXXException;
总体来说,Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error。
3、有个重要的点需要记住, 就是try-catch-finally中rerun的执行顺序问题
try、catch、finally语句块的执行顺序:
1> 当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;
2> 当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处 理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;
3> 当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;
4、什么时候用到finally?
某些事务(除内存外)在异常处理完后需要恢复到原始状态, 如:开启的文件,网络的连接等。

浙公网安备 33010602011771号