Подтвердить что ты не робот

В многосекундном блоке Java 7 какой тип пойманного исключения?

В многозадачном блоке Java 7, таком как:

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

каков тип времени компиляции ex? Является ли это наиболее производным классом, который имеет оба типа исключений? В этом примере это будет IOException.

4b9b3361

Ответ 1

Да, тип ex - это самый конкретный супертип как CharacterCodingException, так и UnknownServiceException, который был бы IOException.

Изменить: Прямо от устья лошади на http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Documentation-v0.83.html#multi_catch:

Неофициально, lub (наименьшая верхняя граница) является наиболее специфичным супертипом рассматриваемых типов.

Ответ 2

В 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<?>