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
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); } }
Atas ialah kandungan terperinci Cara menggunakan pengecualian Java mengendalikan UncaughtExceptionHandler. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!