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
Lepaskan: 2024-12-03 09:52:10
asal
1064 orang telah melayarinya

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

    }
  }
}
Salin selepas log masuk

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();
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan