Rumah  >  Artikel  >  Java  >  Cara menggunakan pengecualian Java mengendalikan UncaughtExceptionHandler

Cara menggunakan pengecualian Java mengendalikan UncaughtExceptionHandler

PHPz
PHPzke hadapan
2023-04-14 21:55:012037semak imbas

Pengendalian pengecualian

Pengecualian tidak tertangkap benang UncaughtException memerlukan UncaughtZExceptionHandler untuk mengendalikan

Jadi mengapa anda perlu menggunakan UncaughtZExceptionHandler?

  • Benang utama boleh menangkap benang dengan mudah, tetapi sub-benang tidak boleh

  • Seperti yang dapat dilihat daripada kod di bawah, walaupun jika sub-benang membuang pengecualian, utas utama tidak akan Terjejas

public class ChildException implements Runnable{
    public static void main(String[] args) {
        new Thread(new ChildException()).start();
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    }
    @Override
    public void run() {
        throw new RuntimeException();
    }
}
/*
* Exception in thread "Thread-0" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.ChildException.run(ChildException.java:14)
   at java.lang.Thread.run(Thread.java:748)
0
1
2
3
4
5
6
7
8
9
* */
  • Seperti yang dapat dilihat daripada kod di bawah, walaupun anda mahu menggunakan menangkap untuk menangkap pengecualian benang kanak-kanak, ia tidak berguna

  • cuba menangkap adalah untuk utas utama, tiada cara untuk menangkap pengecualian dalam sub-benang

public class CantCatch implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        try {
            new Thread(new CantCatch(), "thread0").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread1").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread2").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread3").start();
            Thread.sleep(300);
        } catch (RuntimeException e) {
            System.out.println("catch");
        }
    }
    @Override
    public void run() {
        throw new RuntimeException();
    }
}
/*
* Exception in thread "thread0" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread1" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread2" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread3" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Process finished with exit code 0
* */

Pengecualian boleh ditangkap dengan kaedah cuba tangkap dalam larian, tetapi ia sangat menyusahkan Kerana anda perlu mencuba tangkapan secara manual

UncaughtExceptionHandler

Sesuaikan UncaughtExceptionHandler

<.>
public class MyUncaughtHandler implements Thread.UncaughtExceptionHandler{
    private String name;
    public MyUncaughtHandler(String name) {
        this.name = name;
    }
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        Logger logger = Logger.getAnonymousLogger();
        logger.log(Level.WARNING, "线程异常" + t.getName(), e);
        System.out.println(name + "捕获" + t.getName()+ e);
    }
}
Gunakan kelas tersuai untuk menangkap pengecualian

Atas ialah kandungan terperinci Cara menggunakan pengecualian Java mengendalikan UncaughtExceptionHandler. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam