首页>Java>正文

java入门基础:再谈java异常

时间:2019-01-17 10:58:22   来源:开源java学习 靖凯开源   阅读:

一、Error和Exception的区别

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。

 

二、checked异常和unchecked异常

Exception又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),Error和RuntimeException及其子类称为未检查异常(Unchecked exception)

其它异常成为受检查异常(Checked Exception)。

 

RuntimeException:

其特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try……catch捕获,也没有用throws抛出,还是会编译通过,如除数为零的ArithmeticException、错误的类型转换、数组越界访问和试图访问空指针等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。

 

受检查的异常(IOException等):这类异常如果没有try……catch也没有throws抛出,编译是通不过的。这类异常一般是外部错误,例如文件找不到、试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

 

三、throw 和 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培训免费试学机会,请联系客服小姐姐。

分享:0

电话咨询

客服热线服务时间

周一至周五 9:00-21:00

周六至周日 9:00-18:00

咨询电话

021-67690939
15201841284

微信扫一扫