代码解读复制代码public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
int x = 1 / 0;
}
};
Thread thd = new Thread(r);
thd.start();
}
默认主线程创建了一个尝试除0而故意抛出ArithmeticException对象的runnable 按照下面的方式编译清单 javac ExceptionThread.java 运行程序 java ExceptionThread 你会看到类ArithmeticException的实例抛出的一条异常栈信息:
代码解读复制代码Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero
at ExceptionThread$1.run(ExceptionThread.java)
at java.lang.Thread.run(Thread.java:745)
一旦run()方法抛出异常,线程就会中止并被下列活动取代:
清单4-2 未捕获异常处理器示例
代码解读复制代码public class ExceptinoThread {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
int x = 1 / 0;
}
};
Thread thd = new Thread(r);
Thread.UncaughtExceptionHandler uceh;
uceh = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("Caught throwable" + e + "for thread" + t);
}
};
thd.setUncaughtExceptionHandler(uceh);
uceh = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("Default uncaught exception handler");
System.out.println("Caught throwable" + e + "for thread" + t);
}
};
thd.setDefaultUncaughtExceptionHandler(uceh);
thd.start();
}
}
编译清单4-2(javac ExceptionThread.java),并运行最终程序(java ExceptionThread)。你应该能观测到这样的输出:
代码解读复制代码Caught throwablejava.lang.ArithmeticException: / by zerofor threadThread[Thread-0,5,main]
因为默认的处理器并未调用,你看不到它的输出。想要看到那样的输出,你必须注释掉thd.setUncaughtExceptionHandler(uceh);这行。如果你也注释掉了thd.setDefaultUncaughtExceptionHandler(uceh);这行,那么你就会看到原本清单4-1中的输出。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。