Создана странная запись в таблице исключений by Sun javac

Для этой программы:

class Test {
    public static void main(String[] args) {
        try {
            throw new NullPointerException();
        } catch (NullPointerException npe) {
            System.out.println("In catch");
        } finally {
            System.out.println("In finally");
        }
    }
}

Sun javac (v 1.6.0_24) создает следующий байт-код:

public static void main(java.lang.String[]);

        // Instantiate / throw NPE
   0:   new     #2;         // class NullPointerException
   3:   dup
   4:   invokespecial   #3; // Method NullPointerException."":()V
   7:   athrow

        // Start of catch clause
   8:   astore_1
   9:   getstatic       #4; // Field System.out
   12:  ldc     #5;         // "In catch"
   14:  invokevirtual   #6; // Method PrintStream.println
   17:  getstatic       #4; // Field System.out

        // Inlined finally block
   20:  ldc     #7;         // String In finally
   22:  invokevirtual   #6; // Method PrintStream.println
   25:  goto    39

        // Finally block
        // store "incomming" exception(?)
   28:  astore_2
   29:  getstatic       #4; // Field System.out
   32:  ldc     #7;         // "In finally"
   34:  invokevirtual   #6; // Method PrintStream.println

        // rethrow "incomming" exception
   37:  aload_2
   38:  athrow

   39:  return

со следующей таблицей исключений:

  Exception table:
   from   to  target type
     0     8     8   Class NullPointerException
     0    17    28   any
    28    29    28   any


Мой вопрос: Почему он включает эту последнюю запись в таблицу исключений?!

Насколько я понимаю, в основном говорится: «, если astore_2 выдает исключение , перехватить и повторить ту же инструкцию ".

Такая запись создается даже с пустыми предложениями try / catch / finally, такими как

try {} catch (NullPointerException npe) {} finally {}

Некоторые наблюдения

  • Компилятор Eclipse не создает такой записи в таблице исключений
  • Спецификация JVM не документирует никаких исключений времени выполнения для инструкции astore .
  • Я знаю, что JVM может вызывать VirtualMachineError по любой инструкции. Я предполагаю, что особая запись предотвращает распространение любых таких ошибок из этой инструкции.

58
задан aioobe 17 June 2011 в 05:13
поделиться