Java UncaughtExceptionHandler接口-捕获运行时异常
摘要 UncaughtExceptionHandler接口用来捕获运行时未被程序捕获异常. 如下面的例子. for (int i=5;i =0 ;i--) {int value = 5 / i;System.out.println(value);} 直接在main方法里执行,在console里是不会报错的. 但仔细看一下代码会发现,当i为0时此处代码应该抛Ari
UncaughtExceptionHandler接口用来捕获运行时未被程序捕获异常.
如下面的例子.
for (int i=5;i >=0 ;i--) {
int value = 5 / i;
System.out.println(value);
}
直接在main方法里执行,在console里是不会报错的.
但仔细看一下代码会发现,当i为0时此处代码应该抛ArithmeticException.为何没有,是因为程序中没有任何异常catch.
如果在main方法中加入
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace();
}} );
再执行会发现console会出现
Exception in thread "main" java.lang.ArithmeticException: / by zero 信息.
在有线程的情况下。对于主线程是无法捕获Thread的异常的。
static class Task implements Runnable {
@Override
public void run() {
for (int i=5;i >=0 ;i--) {
int value = 5 / i;
System.out.println(value);
}
}
}
try {
Thread unCaughtableThread = new Thread(new Task());
unCaughtableThread.start();
} catch (Exception e) {
System.out.print("can do somthing");//无法执行
e.printStackTrace();
}
如果修改一下
try {
Thread caughtableThread = new Thread(new Task());
caughtableThread.setUncaughtExceptionHandler(new SimpleUncaughtExceptionHandler());
caughtableThread.start();
} catch (Exception e) {
System.out.print("can do somthing");//依然不会出执行
e.printStackTrace();
}
static class SimpleUncaughtExceptionHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.err.println(t.getName() + " " +e.getMessage());//这里会捕获异常。
e.printStackTrace();
}
}