Как реализован 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

согласно этому, Вам просто нужно сделать новую запись в таблице исключений, и я не понимаю, почему две записи не могут просто указывать на один и тот же ПК сдвиг.

(отказ от ответственности: я не эксперт в байт-коде, не прикасался к нему в течение многих лет, и поэтому могу что-то пропустить)