java - 为什么 Java 中的 multi-catch 特性要求异常是最终的?

标签 java exception java-7 multi-catch

关于 multi-catch feature 的 Oracle 文档添加到 Java 7 声明 catch 子句中的异常参数隐式为 final

我的问题是:这种限制有什么意义?因为我似乎找不到它带来的任何关键改进。将引用对象标记为 final 只会保护引用本身不被修改,而不是它引用的对象,并且永远不会禁止创建另一个引用并以他们想要的任何方式修改它。

A somewhat relevant question on SO讨论了为什么在 catch 子句中修改异常引用不是最明智的做法,但它与catch任何使用有关子句,而不仅仅是它的多捕获形式。那么,为什么 Java 为 multi-catch 设置一个异常并以特殊方式处理它呢?

最佳答案

在 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();
}

编译器肯定知道抛出的对象是 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();
}

在这种情况下,编译器在编译时不知道异常是哪种类型,因此分配一个新的 IOException到一个可以引用 或者 IOException 的变量或 ParseException不应该被允许。除此之外,首先缺少分配给异常变量的用例。因此,将变量隐式设置为 final 是完全合理的。并避免所有这些困惑。如果确实需要给变量赋值,可以改用旧的catch的写法 block 。

关于java - 为什么 Java 中的 multi-catch 特性要求异常是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587285/

相关文章:

java - 访问 google 任务 api 时出现 403 禁止错误

java - 未检查与已检查的异常处理

java - 在 JDK1.7 上使用修改日期对文件数组进行排序时出现 IllegalArgumentException

java - Jace::虚拟机关机错误

java - 序列化 BigInteger : signum-magnitude mismatch

java - 如何从Macbook上彻底删除jdk 1.8? Scala Web 应用程序项目

java - SimpleDateFormat 解析返回错误值

java - onInvitationReceived 未被调用

java - 错误: Could not find or load main class Application

java - Spark-Java:从命令行构建文档示例