モニターを適切に処理する方法を理解しようと、JVM 仕様を読んでいました。関連するセクションで提供されている例は次のようになります。
0   aload_1             // Push f
1   dup                 // Duplicate it on the stack
2   astore_2            // Store duplicate in local variable 2
3   monitorenter        // Enter the monitor associated with f
4   aload_0             // Holding the monitor, pass this and...
5   invokevirtual #5    // ...call Example.doSomething()V
8   aload_2             // Push local variable 2 (f)
9   monitorexit         // Exit the monitor associated with f
10  goto 18             // Complete the method normally
13  astore_3            // In case of any throw, end up here
14  aload_2             // Push local variable 2 (f)
15  monitorexit         // Be sure to exit the monitor!
16  aload_3             // Push thrown value...
17  athrow              // ...and rethrow value to the invoker
18  return              // Return in the normal case
Exception table:
From    To      Target      Type
4       10      13          any
13      16      13          any
2 番目の例外テーブル エントリが必要な理由がわかりません。によって例外がスローされた場合、monitorexit本当にモニターを終了したいですか? 私が知る限り、スローされる可能性のある例外はNullPointerExceptionとIllegalMonitorStateExceptionです。