捕获线程抛出的异常
在 Java 中,当创建一个新线程时,它会与 main 并发执行 run() 方法线。然而,线程内抛出的异常不能直接在主类中处理。
考虑以下代码:
public class Test extends Thread { public static void main(String[] args) throws InterruptedException { Test t = new Test(); try { t.start(); t.join(); } catch(RuntimeException e) { System.out.println("** RuntimeException from main"); } System.out.println("Main stopped"); } @Override public void run() { try { while(true) { System.out.println("** Started"); sleep(2000); throw new RuntimeException("exception from thread"); } } catch (RuntimeException e) { System.out.println("** RuntimeException from thread"); throw e; } catch (InterruptedException e) { } } }
在这段代码中,从线程中抛出了运行时异常,但是它没有被包含在主类中。为了解决这个问题,Java 提供了一种名为 Thread.UncaughtExceptionHandler 的便捷机制。
使用 Thread.UncaughtExceptionHandler
Thread.UncaughtExceptionHandler 提供了一种处理异常的方法,这些异常没有被困在线程中。要使用它,请使用 setUncaughtExceptionHandler() 为线程分配一个处理程序,并重写其 uncaughtException() 方法来定义异常处理逻辑。
这是一个示例:
Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread th, Throwable ex) { System.out.println("Uncaught exception: " + ex); } }; Thread t = new Thread() { @Override public void run() { System.out.println("Sleeping ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted."); } System.out.println("Throwing exception ..."); throw new RuntimeException(); } }; t.setUncaughtExceptionHandler(h); t.start();
在此代码中,处理程序将未捕获的异常打印到控制台。通过使用Thread.UncaughtExceptionHandler,可以在主类中有效地处理线程内抛出的异常。
以上是Java中如何处理线程抛出的未捕获异常?的详细内容。更多信息请关注PHP中文网其他相关文章!