首頁 > Java > java教程 > Java中如何處理執行緒拋出的未捕獲異常?

Java中如何處理執行緒拋出的未捕獲異常?

Susan Sarandon
發布: 2024-12-03 09:52:10
原創
996 人瀏覽過

How to Handle Uncaught Exceptions Thrown by Threads in Java?

擷取執行緒拋出的例外

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板