今天遇到了这样一段代码,代码中有一个try catch,但是奇怪的是try括起来的代码中的方法调用都不会抛异常,这是什么情况呢?
首先,我们所说的“不会抛异常”,是指调用的方法签名中并没有throw exception。也就是说调用方法不会抛出checked exception。那么还有一种可能就是这个方法可能会抛出runtime exception。
于是第一个问题是:我们知道runtime exception可以被JVM捕获,runtime exception也可以被try catch捕获吗?
于是写了一个小例子验证了一下:
try{ throw new RuntimeException(); } catch (Exception ex) { System.out.println("runtime exception can be catched by try catch block.") }
结果是:啊!原来runtime exception是可以被try catch捕获到的呀!!
第二个问题:这种用try catch捕获runtime exception的代码貌似不常见吧(虽然我也没有见过太多代码),为什么呢?
那么什么是runtime exception,经过查了一些资料,我的理解是这样的:
首先java程序运行中的问题,会分为exception和error两种。其中error是指无法恢复的严重情况,比如之前用c语言时常见的stackoverflow等内存不够用的错误。对于exception而言,又可以分为checked exception和unchecked exception。
个人理解,概念的分类(比如上面的两次分类)都是因为当时定义概念的时候是相对而言的,也就是存在一个度,在这个度的左边,就是error,在右边,就是exception。对于checked exception和runtime exception也是一样的。所以,我们要理解runtime exception就要先理解什么叫做checked exception。
checked exception,使用“顾名思义”这种最简单的理解方式,他指的是java编译器所能够识别(check)出来的exception。那么编译器是没有那么聪明的,他的做法猜测就是看到某个地方有throw exception这样的动作,就必须在调用层中要么发现throw exception,要么发现catch到该exception。当然,对于checked exception,也可以一直throw,知道throw出main函数被JVM捕获。从这个角度理解,checked exception指的就是用throw语句显式抛出的异常。也就是写API的人预想到某种情况下,可能会出问题,并且这个问题值得被处理,那么就会在某个if分支下抛出异常,然后也就创造出了一个checked exception。
插播一句话,不对编译错误显示红色的IDE不是好IDE。
那么相对而言,runtime exception就不一样了,写API的人没有将可能发生runtime exception的情况用if写下来并且throw exception。原因可能有多种,比如对于常见的runtime exception,对于NullPointerException和ArrayIndexOutOfBoundException,这种错误都是programmer可以通过严格的编码来避免的。因此也就是不值得API的设计人员专门写一个if分支来处理这种问题。对于runtime exception的处理,可以通过try catch来处理,也可以不做处理,直接交给JVM。
好像内容有点浅,先把博客放在这里,以后有了其他认识再来更新吧。
较真儿Runtime Exception与Checked Exception,布布扣,bubuko.com
较真儿Runtime Exception与Checked Exception
原文:http://www.cnblogs.com/Garfield-yafei/p/3571786.html