Как можно встроить методы, генерирующие исключения? - PullRequest
11 голосов
/ 28 августа 2011

Мне просто интересно, как Java JVM может иногда использовать встроенные методы, которые могут генерировать исключения. Я предполагаю, что возможно встроить по крайней мере некоторые такие методы (например, те, которые имеют доступ к массиву и, следовательно, могут генерировать ArrayIndexOutOfBoundsException s). Проблема, которую я вижу, состоит в том, что, если исключение действительно происходит, как вы показываете правильную трассировку стека, если вы встроили метод? Поскольку разные методы могут быть встроены на разных машинах, как встраивание не нарушает механизм трассировки стека?

Ответы [ 2 ]

10 голосов
/ 28 августа 2011

Какую проблему вы видите?Поскольку сама JVM выполняет встраивание, ничто не мешает ей вспомнить, где она была встроена, и исправить это при построении трассировки стека для установки в объект Throwable.

Когда исключение сгенерировано , JVM будет обходить стек ЦП и выяснять, соответствует ли каждый кадр стека машины интерпретированному байт-коду, JIT-коду, собственному коду из библиотек и т.Для этого он ссылается на таблицы, которые сообщают, какие адреса в машинном коде соответствуют каким инструкциям из байт-кода (и далее обратно к исходным строкам, если эта информация присутствует в файле класса).Эта таблица может совершенно точно указать, что определенное место в коде JITted может соответствовать более чем одному фрейму стека уровня Java.

Однако для этого JVM не требуется .Он также может просто построить трассировки стека с таинственными разрывами в них.См. javadoc для Throwable.getStackTrace () .(Нет даже требования, чтобы JVM могла генерировать трассировки стека на всех ).

3 голосов
/ 28 августа 2011

Возможно, вы захотите проверить этот документ , в котором объясняется, как работает обработка исключений в JVM:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...