JavaSe:UncaughtExceptionHandler

Java中,出现对于异常的处理,通常是使用try{}catch()来捕获处理的。但是在使用trycatch时,未必会将所有的异常都捕获到,所以方法声明时可以有throws xxxException。

对于这种情况,JVM到底是怎么处理的呢?下面就来看一看:

如果异常没有被catch到,那么会走接下来的流程:

1)由Thread自身的uncaughtExceptionHandler来处理

前提是Thread#uncaughtExceptionHandler不是Null。

如果是null,执行2)。

2)由Thread所属的ThreadGroup的uncaughtException方法来处理。

2.1)如果ThreadGroup有parent group,那么就调用parent group的uncaughtException来处理。也就是说,要调用最顶层的ThreadGroup的uncaughtException来处理。处理完毕就结束。最顶层的ThreadGroup处理过程是2.2)。

2.2)Thread类中有一个类静态变量:defaultUncaughtExceptionHandler。

如果有设置该值,就调用该handler的uncaughtException来处理。

如果没有设置defaultUncaughtExceptionHandler值,又不是ThreadDeath错误,则直接在System.error中打出异常日志(包括异常栈)。

上述处理过程,参见:Thread#dispatchUncaughtException(Throwable e);

那么在我们编写代码时,是可以通过:

1)Thread#setUncaughtExceptionHander() 来为某个线程设置UncaughtExceptionHander。

2)Thread.setDefaultUncaughtExceptionHander()来为设置默认的UncaughtExceptionHander。

3)如果想要改变默认的调度流程:可以重写ThreadGroup#uncaughtException() 来完成。

上一篇:Multi-voltage和power gating的实现


下一篇:HDU 4597 Play Game 记忆化DP