如何在Java中的单个catch块中捕获多种类型的异常时为异常提供final修饰符
答案 0 :(得分:5)
您无需将每个例外标记为最终。只是第一个。
try {
} catch(final IllegalArgumentException | ArrayIndexOutOfBoundsException e) {
e = new RuntimeException();//this will not be allowed as e is final
}
话虽如此,您不需要将e
标记为final,因为在使用 multi-catch 语句时无论如何都无法在catch块中重新分配。
以下是JLS
的相关部分隐式声明了multi-catch子句的异常参数 如果没有明确宣布为final,则为final。
如果是异常参数,则是编译时错误 隐式或显式声明的final被赋值给body 捕获条款。
答案 1 :(得分:1)
以下内容旨在提供权威的答案。
Java Language Specification, Java SE 7 Edition, §14.20:
如果未明确声明
final
,则多个catch子句的异常参数将隐式声明为final
。
至于语法:
CatchClause:
catch ( CatchFormalParameter ) Block
CatchFormalParameter:
VariableModifiersopt CatchType VariableDeclaratorId
这意味着您可以在catch类型前面应用单个final
(在multi-catch的情况下,将其指定为各个异常类型的并集)。您的困惑可能在于多捕获不包含多个,但只包含一个捕获变量声明。