ITEEDU

Java Gossip: UncaughtExceptionHandler

在J2SE 5.0之前,如果您想要统一处理某些执行绪的unchecked例外,您可以使用一个ThreadGroup来管理,您继承ThreadGroup,并重 新定义其uncaughtException()方法,而在J2SE 5.0之后,您不用这么麻烦,您可以让您的例外处理类别实作Thread.UncaughtExceptionHandler,并实现其 uncaughtException()方法,例如:

ThreadExceptionHandler.java
package onlyfun.caterpillar;
public class ThreadExceptionHandler
implements Thread.UncaughtExceptionHandler {
	public void uncaughtException(Thread t, Throwable e) {
		System.out.println(t.getName());
		e.printStackTrace();
	}
}

您可以使用Thread的setUncaughtExceptionHandler()方法来设定例外处理对象,例如:
ThreadExceptionDemo.java

package onlyfun.caterpillar;
public class ThreadExceptionDemo {
	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				// 除 0 的错误
				int n = 1/0;
			}
		}, "testThread");
		thread.setUncaughtExceptionHandler(
		new ThreadExceptionHandler());
		thread.start();
	}
}

在这个程序中,我们故意产生除零的例外,例外丢出后会由ThreadExceptionHandler对象来处理,执行结果如下:

testThread
java.lang.ArithmeticException: / by zero
at onlyfun.caterpillar.ThreadExceptionDemo$1.run(
ThreadExceptionDemo.java:8)
at java.lang.Thread.run(Unknown Source)