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

And*_*rew 27 java exception java-7

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

try {
    // code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
    // handle exception
}
Run Code Online (Sandbox Code Playgroud)

什么是编译时类型ex?它是两个异常类型共同的派生类最多的类吗?在这个例子中,这将是一个IOException.

gus*_*afc 25

是的,类型ex是双方的最具体的超类型CharacterCodingExceptionUnknownServiceException,这将是IOException.

编辑:直接从马的嘴上http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Documentation-v0.83.html#multi_catch:

非正式地,lub(最小上限)是所讨论类型中最具体的超类型.

  • 供将来参考:`lub`计算定义在这里:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7 (2认同)

irr*_*ble 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<?>
Run Code Online (Sandbox Code Playgroud)