title: How do I exit a monitor in bytecode properly?
body: <p>I was reading the JVM specification to try to figure out how to properly handle monitors. The example they give in <a href="http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.14" rel="nofollow">the relevant section</a> looks like this:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>I can not figure out why the second exception table entry is needed. If an exception is thrown by <code>monitorexit</code> do I really want to attempt to exit the monitor again? 
  Possible exceptions thrown as far as I can tell are <code>NullPointerException</code> and <code>IllegalMonitorStateException</code>.</p>