较真儿Runtime Exception与Checked Exception

今天遇到了这样一段代码,代码中有一个try catch,可是奇怪的是try括起来的代码中的方法调用都不会抛异常,这是什么状况呢?java

首先,咱们所说的“不会抛异常”,是指调用的方法签名中并无throw exception。也就是说调用方法不会抛出checked exception。那么还有一种可能就是这个方法可能会抛出runtime exception。函数

因而第一个问题是:咱们知道runtime exception能够被JVM捕获,runtime exception也能够被try catch捕获吗?编码

因而写了一个小例子验证了一下:spa

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的代码貌似不常见吧(虽然我也没有见过太多代码),为何呢?code

那么什么是runtime exception,通过查了一些资料,个人理解是这样的:blog

首先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。

好像内容有点浅,先把博客放在这里,之后有了其余认识再来更新吧。

相关文章
相关标签/搜索