Как реализован multi-catch в Java 7?
как компилятор Java 7 обрабатывает блоки multi-catch ? Наивной реализацией было бы создание байт-кода, как если бы присутствовало несколько блоков catch. Тем не менее, я собрал из нескольких источников, что это не так - блок catch, который обрабатывает несколько типов исключений, не создает повторяющийся байт-код во время компиляции.
Итак, как это работает ? Есть ли новая инструкция байт-кода, которая сообщает JVM о блоках multi-catch ?
2 ответов
на основе Спецификация Виртуальной Машины 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
таблица исключений работает как своего рода переключатель, повторяющий все классы исключений (записи в таблице исключений) и проверяющий, реализует ли вызванное исключение, таким образом решая, где перейти в байт-код.
http://www.artima.com/underthehood/exceptions.html
согласно этому, Вам просто нужно сделать новую запись в таблице исключений, и я не понимаю, почему две записи не могут просто указывать на один и тот же ПК сдвиг.
(отказ от ответственности: я не эксперт в байт-коде, не прикасался к нему в течение многих лет, и поэтому могу что-то пропустить)