本篇内容主要讲解“Java异常处理UncaughtExceptionHandler如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java异常处理UncaughtExceptionHandler如何使用”吧!
异常处理
线程未捕获异常 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捕获子线程异常,时没有用的
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
自定义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
* */
版权声明:除特别声明外,本站所有文章皆是本站原创,转载请以超链接形式注明出处!