I notice, in this javadoc, https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html that an UncaughtExceptionHandler is used for when an exception occurs but is not caught. But, will that thread fail quietly? I guess so, because it is going about its business asynchronously, but I’m investigating a related issue with one of our processes, and am surprised at only being aware of this now, 10+ years into my career.
Advertisement
Answer
I finally got to the bottom of my specific problem. It was due to shoddy error handling, allowing the thread to fail quietly:
public class Main { public static void main(String[] args) throws InterruptedException { Thread t = new Thread() { public void run() { try { //do some stuff } catch (Exception e) { e.printStackTrace(); } System.out.println("done-worker thead"); throw new RuntimeException("purposeful!"); } }; t.setUncaughtExceptionHandler( (thread, throwable) -> System.out.println("main thread; uncaugh exception from worker threadt: " + throwable.getMessage())); t.start(); TimeUnit.SECONDS.sleep(10); System.out.println("done-main thead"); } }
In doing “some stuff”, the application hit an OutOfMemoryError, which is not, strictly seaking, an Exception. Changing the above to catch(Throwable t)
, solved it.