7.捕获线程中的运行时异常

2021-08-02  本文已影响0人  nieniemin

Java API中为我们提供了一个用于捕获线程内部运行时异常的接口UncaughtExceptionHandler ,通过实现这个接口并给线程指定异常捕获器就可以实现捕获线程中的运行时异常。

public class UncaughtException {

 private final static  int A = 10;
 private final static  int B = 0;
 public static void main(String[] args) {
 Thread thread =  new Thread(()-> {
 // 指定一个算数异常java.lang.ArithmeticException: / by zero
 int result = A / B;
 System.out.println("result:" + result);
 });

 // 调用当前线程的setUncaughtExceptionHandler方法,捕获线程中的运行时异常
 thread.setUncaughtExceptionHandler((t, e) -> {
 System.out.println(t);
 System.out.println(e);
 });
 thread.start();
 }
}

***********************************************
Thread[Thread-0,5,main]
java.lang.ArithmeticException: / by zero

Thread还提供了一个Thread.currentThread().getStackTrace()方法,返回一个表示该线程堆栈转储的堆栈跟踪元素数组。
如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。

public class UncaughtException {

 public static void main(String[] args) {
 test();
 }

 public static void test() {

 StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

 Arrays.asList(stackTrace).stream()
 .forEach(e-> {
 Optional.of("classname:" + e.getClassName()
 + "\n methoname:" + e.getMethodName()
 + "\n linenumber:" + e.getLineNumber()
 + "\n filename:" + e.getFileName())
 .ifPresent(System.out::println);
 });
 }

}

**********************************************************************
classname:java.lang.Thread
 methoname:getStackTrace
 linenumber:1556
 filename:Thread.java
classname:uncaughtex.UncaughtException
 methoname:test
 linenumber:34
 filename:UncaughtException.java
classname:uncaughtex.UncaughtException
 methoname:main
 linenumber:29
 filename:UncaughtException.java

参考:https://blog.csdn.net/qq_32907195/article/details/106852879

上一篇下一篇

猜你喜欢

热点阅读