Rumah >Java >javaTutorial >Bagaimana Mengendalikan Pengecualian Tidak Ditangkap yang Dilemparkan oleh Benang di Jawa?

Bagaimana Mengendalikan Pengecualian Tidak Ditangkap yang Dilemparkan oleh Benang di Jawa?

Susan Sarandon
Susan Sarandonasal
2024-12-03 09:52:10985semak imbas

How to Handle Uncaught Exceptions Thrown by Threads in Java?

Menangkap Pengecualian yang Dilemparkan oleh Benang

Di Java, apabila benang baharu dicipta, ia melaksanakan kaedah run()nya serentak dengan yang utama benang. Walau bagaimanapun, pengecualian yang dilemparkan dalam urutan tidak boleh dikendalikan secara langsung dalam kelas utama.

Pertimbangkan kod berikut:

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) {

    }
  }
}

Dalam kod ini, pengecualian masa jalan dibuang daripada utas, tetapi ia tidak terperangkap dalam kelas utama. Untuk menangani isu ini, Java menyediakan mekanisme yang mudah dipanggil Thread.UncaughtExceptionHandler.

Menggunakan Thread.UncaughtExceptionHandler

A Thread.UncaughtExceptionHandler menyediakan cara untuk mengendalikan pengecualian yang tidak terperangkap dalam benang. Untuk menggunakannya, tetapkan pengendali pada urutan menggunakan setUncaughtExceptionHandler() dan ganti kaedah uncaughtException() untuk menentukan logik pengendalian pengecualian.

Berikut ialah contoh:

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

Dalam ini kod, pengendali mencetak pengecualian yang tidak ditangkap pada konsol. Dengan menggunakan Thread.UncaughtExceptionHandler, pengecualian yang dilemparkan dalam thread boleh dikendalikan dengan berkesan dalam kelas utama.

Atas ialah kandungan terperinci Bagaimana Mengendalikan Pengecualian Tidak Ditangkap yang Dilemparkan oleh Benang di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn