在Java 7 multicatch块中,捕获的异常的类型是什么?

时间:2011-12-05 22:48:30

标签: java exception java-7

在Java 7多个分块中,如下所示:

try {
    // code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
    // handle exception
}

ex的编译时类型是什么?它是两个异常类型共有的派生类最多的类吗?在此示例中,它将是IOException

2 个答案:

答案 0 :(得分:25)

是的,ex的类型是CharacterCodingExceptionUnknownServiceException中最具体的超类型,即IOException

编辑: http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Documentation-v0.83.html#multi_catch直接离开马口:

  

非正式地,lub(最小上限)是所讨论类型中最具特异性的超类型。

答案 1 :(得分:14)

在JSL 7中http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20-510

§14.20>声明的异常参数类型,表示其类型为与的联合 替代品D1 | D2 | ...... | Dn是lub(D1,D2,...,Dn)(§15.12.2.7)。

lub()的定义,即最小上限是非常错综复杂的。幸运的是,我们在这里讨论的类型通常只是Throwable的非泛型子类,lub()产生最具体的超类。

对于更复杂的情况,请考虑

class E1 extends Exception implements G<A>
class E2 extends Error implements G<B>

lub(E1, E2) = Throwable & G<?>