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();
    }
}