如何在multi-catch语句中使用final?

时间:2015-07-07 10:04:45

标签: java exception

如何在Java中的单个catch块中捕获多种类型的异常时为异常提供final修饰符

2 个答案:

答案 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的情况下,将其指定为各个异常类型的并集)。您的困惑可能在于多捕获不包含多个,但只包含一个捕获变量声明。