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

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

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

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

是的, ex的类型是CharacterCodingExceptionUnknownServiceException的最具体的超类型,它将是IOException

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

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

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

§14.20>exception参数的声明类型,表示其类型为与备用D1 |的并集 D2 | …… | Dn是lub(D1,D2,…,Dn)(§15.12.2.7)。

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

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

 class E1 extends Exception implements G class E2 extends Error implements G lub(E1, E2) = Throwable & G