1、Error(unchecked异常)
是程序无法处理的错误,通常发生于虚拟机自身,表示运行应用程序中较严重问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
2、Exception(checked异常)
必须处理的异常:Checked异常是Java特有的,在java设计哲学中,Checked异常被认为是可以被处理或者修复的异常,所以Java程序必须显式处理Checked异常,当我们使用或者出现Checked异常类的时候,程序中要么显式try- catch捕获该异常并修复,要么显式声明抛出该异常,否则程序无法通过编译。
3、Error和Exception的联系
继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Exception。
Exception又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),Error和RuntimeException及其子类称为未检查异常(Unchecked exception)
其它异常成为受检查异常(Checked Exception)。
RuntimeException:
其特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try……catch捕获,也没有用throws抛出,还是会编译通过,如除数为零的ArithmeticException、错误的类型转换、数组越界访问和试图访问空指针等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。
受检查的异常(IOException等):这类异常如果没有try……catch也没有throws抛出,编译是通不过的。这类异常一般是外部错误,例如文件找不到、试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
throw 是用来抛出任意异常的,你可以抛出任意 Throwable,包括自定义的异常类对象;throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。如果方法抛出了异常,那么调用这个方法的时候就需要处理这个异常。
try-catch-finally-return执行顺序
1、不管是否有异常产生,finally块中代码都会执行;
2、当try和catch中有return语句时,finally块仍然会执行;
3、finally是在return后面的表达式运算后执行的,所以函数返回值是在finally执行前确定的。无论finally中的代码怎么样,返回的值都不会改变,仍然是之前return语句中保存的值;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
举例:
情况1:try{} catch(){}finally{} return;
按正常顺序执行。
情况2:try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块后面的return语句不再执行。
情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:
则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
最后执行catch块中return. finally块后面的return语句不再执行。
无异常:
执行完try再finally再执行最后的return语句.
情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。
try-catch-finally
最后,我们在java学习中要不断积累对各种异常的处理方法,面试中多问到的所谓开发经验、项目经验有大半都涉及到对异常的处理经验。所谓程序都是调处来的不是写出来的就是这个道理,只有在学习过程中积攒扎实的编程基础,才能在程序报错时手到拈来。(来自公众号:开源java学习 靖凯开源)
Java异常相关推荐阅读:
《JAVA异常处理方式 try-catch-finally 》
《Java异常解读以及通过业务逻辑解决异常的方式》
《JAVA异常与其处理机制》
更多Java学习资料视频和上海尚学堂Java培训免费试学机会,请联系客服小姐姐。