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