fork download
  1. import java.util.*;
  2. import java.util.concurrent.locks.*;
  3.  
  4. class Locker implements AutoCloseable {
  5. private final Lock lock;
  6. Locker(Lock lock) { this.lock = Objects.requireNonNull(lock);
  7. this.lock.lock(); }
  8. @Override public void close() { lock.unlock(); }
  9. }
  10.  
  11. class Example {
  12. static ReentrantLock lock = new ReentrantLock();
  13. static void modifySharedState() {
  14. lock.unlock(); // program bug 1. causes unlock() in close() to throw
  15. ((Object) null).toString(); // program bug 2. causes modifySharedState() to throw
  16. }
  17.  
  18. public static void main(String[] args) {
  19. try (Locker locker = new Locker(lock)) {
  20. // If both modifySharedState() and unlock()
  21. // throw an exception, the unlock() exception
  22. // is added to the modifySharedState()'s
  23. // suppressed exceptions.
  24. modifySharedState();
  25. }
  26. }
  27.  
  28. static {
  29. Thread.currentThread().setUncaughtExceptionHandler(
  30. (Thread t, Throwable x) ->
  31. x.printStackTrace(System.out)
  32. );
  33. }
  34. }
Runtime error #stdin #stdout 0.13s 4386816KB
stdin
Standard input is empty
stdout
java.lang.NullPointerException
	at Example.modifySharedState(Main.java:15)
	at Example.main(Main.java:24)
	Suppressed: java.lang.IllegalMonitorStateException
		at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
		at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
		at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)
		at Locker.close(Main.java:8)
		at Example.main(Main.java:25)