Java子线程异常及异常处理

最近使用线程池时,了解到了在子线程中抛出异常,主线程的处理方式。

Java中抛出 Exception 时必须使用 try..catch 块处理,但是抛出 RuntimeException 和 Error 时可以不使用 try..catch 块来处理,但是会导致线程中断。如下为抛出RuntimeException代码示例:

public class ChildThread implements Runnable{ 
@Override public void run() { 
System.out.println("进入子线程"); 
throw new TestException(); 
} 
} 
class TestException extends RuntimeException{ 
public TestException(){ 
super("我是Exception"); 
} 
}

但是抛出Exception时会要求处理:

Java子线程异常及异常处理_第1张图片

 

在子线程中如果抛出异常的话,主线程是不会感受到这个异常的,并且也不能通过 try..catch 来捕获这个异常,但是如果子线程是继承了 Thread 的话是可以通过 Thread.setUncaughtExceptionHandler 方法来捕获到这个异常并进行处理的。如下为主线程捕获子线程异常代码示例:

public class ThreadTest { 
public static void main(String[] args) { 
new ThreadThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(t.getName()+" "+e.getMessage()); 
} 
}); 
System.out.println("主线程完成"); 
} 
} 

class ThreadThread extends Thread {
 @Override public void run(){ 
System.out.println("ASDASDASD"); 
} 
}

 

你可能感兴趣的:(Java学习)