擷取執行緒拋出的例外
在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中文網其他相關文章!