Каков тип перехваченного исключения в многоадресном блоке Java 7? - PullRequest
27 голосов
/ 06 декабря 2011

В многоадресном блоке Java 7, таком как следующий:

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

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

Ответы [ 2 ]

25 голосов
/ 06 декабря 2011

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

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

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

14 голосов
/ 06 декабря 2011

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