Sem*_*nic 11 java exception java-7 multi-catch
关于添加到Java 7 的多捕获功能的Oracle文档声明该catch子句中的异常参数是隐式的final.
我的问题是:这种限制有什么意义?因为我似乎无法找到它带来的一个重要改进.将引用对象标记为final仅保护引用本身不被修改,而不是它引用的对象,并且永远不会禁止创建另一个引用并以任何他们想要的方式修改它.
关于SO的一个有点相关的问题讨论了为什么修改catch子句中的异常引用不是最明智的事情,但它涉及到该子句的任何使用catch,而不仅仅是它的多捕获形式.那么为什么Java会为多重捕获制造一个例外,并以特殊的方式对待它?
谢谢!
man*_*uti 19
在uni-catch子句中,您可以自由地重新分配异常对象.例如,这工作正常:
try {
... // code that can throw IOException or some user-defined ParserException
} catch(IOException) {
e = new IOException(); // this is acceptable (although there is no point in doing it)
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
编译器确定抛出的对象是类型的IOException.但是,在multi-catch子句中,您可以使用以下内容:
try {
... // code that can throw IOException or some user-defined ParserException
} catch(IOException | ParserException e) {
e = new IOException(); // this is NOT acceptable -- e may reference a ParserException
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器不知道哪种类型的例外是在编译时间,所以分配一个新的IOException到可引用变量或者一个IOException或ParseException不应该被允许.除此之外,缺少用于首先分配异常变量的用例.因此,隐式地创建变量final并避免所有这些混淆是完全合理的.如果您确实需要分配给变量,则可以切换到编写catch块序列的旧方法.
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |