JVM exceptions are weird: a decompiler perspective
Исследуя декомпиляцию Java-классов, автор обнаружил, что обработка исключений в JVM значительно сложнее обычного потока управления. В отличие от явных конструкций вроде if и while, которые реализуются через инструкции перехода, исключения обрабатываются неявно через отдельную "таблицу исключений". Эта таблица связывает регионы байткода с соответствующими обработчиками, очищает стек при исключении и передает управление обработчику.
Особую сложность представляют крайние случаи: регионы в таблице могут пересекаться без вложенности, а целевые обработчики могут находиться перед началом региона или даже внутри него. Реальные Java-файлы часто нарушают интуитивные предположения о структуре, что усложняет декомпиляцию. Особенно проблематичны конструкции try-finally, где finally-блок должен выполняться независимо от возникновения исключения, но должен знать, куда передать управление после завершения.