10.4.4 Java 7增强的throw语句
10.4.4 Java 7增强的throw语句
对于如下代码:
1 | try |
上面代码片段中的1号代码再次抛出了捕获到的异常,但这个ex对象的情况比较特殊:
程序捕获该异常时,声明该异常的类型为Exception
;
但实际上try
块中只调用了FileOutputStream
构造器,这个构造器声明只是抛出了FileNotFoundException
异常。
在Java 7
以前,Java
编译器的处理“简单而粗暴”——由于在捕获该异常时声明ex
的类型是Exception
,因此Java
编译器认为这段代码可能抛出Exception
异常,所以包含这段代码的方法
通常需要声明抛出Exception
异常。例如如下main
方法。
1 | import java.io.*; |
从Java 7
开始,Java
编译器会执行更细致的检查,Java编译器会检查throw
语句抛出异常的实际类型,这样编译器知道1号代码处实际上只可能抛出FileNotFoundException
异常,因此在调用者main
方法签名中只要声明抛出FileNotFoundException
异常即可。即可以将代码改为如下形式:
1 | import java.io.*; |
总结
从Java 7
开始,Java编译器会检查throw
语句抛出异常的实际类型,而不是直接使用catch
块括号中声明异常形参的异常类型