在Java 7多个分块中,如下所示:
try {
// code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
// handle exception
}
ex
的编译时类型是什么?它是两个异常类型共有的派生类最多的类吗?在此示例中,它将是IOException
。
答案 0 :(得分:25)
是的,ex
的类型是CharacterCodingException
和UnknownServiceException
中最具体的超类型,即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<?>