Ответ 1
Основываясь на Спецификации виртуальной машины Java, исключения скомпилируются следующим образом (в резюме):
- попробуйте код запускается нормально
- каждый блок catch скомпилирован, как если бы это был отдельный метод
- существует таблица исключений для перенаправления потока выполнения в правый блок catch
При использовании предложения multi catch блок catch один и тот же (появляется только один раз), но таблица исключений будет содержать еще одну запись с теми же значениями from, to и target.
Например, этот код:
public static void main(String args[]) throws InterruptedException {
try {
System.out.println("why not?");
} catch (IllegalArgumentException e) {
System.out.println("here");
} catch (IllegalStateException | ArithmeticException e) {
System.out.println("there");
}
}
генерирует следующую таблицу исключений (на моей машине):
from to target type
0 8 11 Class java/lang/IllegalArgumentException
0 8 23 Class java/lang/IllegalStateException
0 8 23 Class java/lang/ArithmeticException