Как многозадачность реализована в Java 7?

Как компилятор Java 7 обрабатывает блоки с несколькими ловушками? Наивная реализация заключалась бы в создании байт-кода, как если бы присутствовали несколько блоков catch. Тем не менее, я собрал из нескольких источников, что это не так. Блок catch, который обрабатывает несколько типов исключений, не обеспечивает дублирования байт-кода во время компиляции.

Итак, как это работает? Есть ли новая инструкция по байт-коду, которая сообщает JVM о блоках с несколькими ловушками?

Ответы

Ответ 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

Ответ 2

Таблица исключений работает как своего рода перекрестный итератор по всем классам исключений (записи в таблице исключений) и проверяет, реализует ли это исключенное исключение, тем самым решая, куда перейти в байт-код.

http://www.artima.com/underthehood/exceptions.html

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

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