Maison > Java > javaDidacticiel > le corps du texte

Comment utiliser la gestion des exceptions Java UncaughtExceptionHandler

PHPz
Libérer: 2023-04-14 21:55:01
avant
2026 Les gens l'ont consulté

Gestion des exceptions

Exception de thread non interceptée UncaughtException nécessite la gestion d'UncaughtZExceptionHandler

Alors pourquoi devez-vous utiliser UncaughtZExceptionHandler ?

  • Le thread principal peut facilement capturer le thread, mais le sous-thread ne le peut pas

  • Comme vous pouvez le voir dans le code ci-dessous, même si le sous-thread lève une exception, le thread principal ne sera pas affecté à all

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
* */
Copier après la connexion
  • Comme vous pouvez le voir dans le code ci-dessous, même s'il est inutile d'utiliser catch pour intercepter les exceptions de sous-thread

  • essayez catch pour le thread principal, il n'y a aucun moyen d'attraper le sous-thread -thread exceptions

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
* */
Copier après la connexion

Les exceptions peuvent être interceptées par try catch dans la méthode d'exécution, mais particulièrement gênantes, car vous devez essayer manuellement catch dans chaque méthode d'exécution

UncaughtExceptionHandler

Personnaliser 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);
    }
}
Copier après la connexion

Utilisez une classe personnalisée pour attraper des exceptions

public class UseOwnExceptionHandler implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtHandler("MyHandler"));
//        try {
        new Thread(new UseOwnExceptionHandler(), "thread0").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread1").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread2").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread3").start();
        Thread.sleep(300);
//        } catch (RuntimeException e) {
//            System.out.println("catch");
//        }
    }
    @Override
    public void run() {
//        try {
        throw new RuntimeException();
//        } catch (RuntimeException e) {
//            System.out.println("e");
//        }
    }
}
/*
* 一月 29, 2023 11:22:01 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 线程异常thread0
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕获thread0java.lang.RuntimeException
一月 29, 2023 11:22:01 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 线程异常thread1
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕获thread1java.lang.RuntimeException
一月 29, 2023 11:22:02 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 线程异常thread2
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕获thread2java.lang.RuntimeException
一月 29, 2023 11:22:02 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 线程异常thread3
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕获thread3java.lang.RuntimeException
Process finished with exit code 0
* */
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal