线程未捕获异常 uncaughtexception 需要uncaughtzexceptionhandler 来进行处理
那么为什么非要用UncaughtZExceptionHandler呢?
主线程可以轻松捕获线程,子线程不可以
从下面代码可知,即使子线程抛出异常,主线程丝毫不受影响
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
* */从下面代码可知,即使想用catch捕获子线程异常,时没有用的
立即学习“Java免费学习笔记(深入)”;
try catch 是针对主线程的,没有办法捕获子线程的异常
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
* */在run方法中进行try catch可以捕获到异常,但是特别麻烦,因为需要手动地在每个run方法中都进行try catch
自定义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);
}
}使用自定义的类来捕获异常
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
* */以上就是Java异常处理UncaughtExceptionHandler如何使用的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号