How uncaught exceptions are handled

In our discussion ofunchecked exceptions, we mentioned that when these exceptions are not caught in atry/catchblock, then what you often see in practice is Java print the exception stack trace and then terminate your program. In reality, this is a simplistic view of what happens, and we'll look in more detail here.

Java actually handles uncaught exceptions according to thethreadin which they occur. When an uncaught exception occurs in a particular thread, Java looks for what is called anuncaught exception handler, actually an implementaiton of the interfaceUncaughtExceptionHandler. The latter interface has a methodhandleException(), which the implementer overrides to take appropriate action, such as printing the stack trace to the console. As we'll see in a moment, we can actually install our own instance ofUncaughtExceptionHandlerto handle uncaught exceptions of a particular thread, or even for the whole system.

The specific procedure is as follows. When an uncaught exception occurs, the JVM does the following:

  • it calls a special private method,dispatchUncaughtException(), on theThreadclass in which the exception occurs;
  • it thenterminates the threadin which the exception occurred1.

ThedispatchUncaughtExceptionmethod, in turn, calls the thread'sgetUncaughtExceptionHandler()method to find out the appropriate uncaught exception handler to use. Normally, this will actually be the thread's parentThreadGroup, whosehandleException()method by default will print the stack trace.

However, we can actually override this process for an individual thread, for aThreadGroup, or for all threads, as follows:

Which threads' handler to setHow to setNotes
All Thread.setDefaultUncaughtExceptionHandler() Relies on aThreadGroup'suncaughtException()methodnotbeing overridden, or on any overriding implementation checking for the default handler.
All for a particular thread group OverrideThreadGroup.uncaughtException() Means you have to provide aThreadGroupsubclass.
Individual thread Thread.setUncaughtExceptionHandler() If you're using your ownThreadsubclass, you could also overridegetUncaughtExceptionHandler()

Thus, the full process used to determine which uncaught exception handler is called is shown in Figure 2 below:

Uncaught exception handler flow diagram
Figure 2: Process by which Java decides on which uncaught exception handler to call for a given thread.

As mentioned above, care must be taken to prevent uncaught exceptions from terminating vital threads (or compensating for thread termination). On the next page, we look at a special case ofuncaught exceptions in the event dispatch thread, where the Java runtime includes code to start a new event dispatch thread when the old one dies.


1. In some cases, you therefore have to be careful to make sure that an uncaught exception doesn't terminate an important thread unexpectedly. For example, an uncaught exception in the thread that handles JavaSound MIDI events will terminate the MIDI event handling thread and prevent further MIDI events from being processed.



http://www.javamex.com/tutorials/exceptions/exceptions_uncaught_handler.shtml


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值