输出调用当前方法的类、方法、行数
在Java中无法输出异常信息时,可能会需要输出调用当前方法的类、方法、行数等信息,根据这些信息可以方便地定位异常原因。
/**
* Created by asus on 2019/7/15.
*/
public class Test {
public static void main(String[] args) {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
if (stackTraceElements.length > 1) {
System.out.println("main方法输出0---调用类:" + stackTraceElements[0].getClassName() + ",调用方法:" + stackTraceElements[0].getMethodName() + ",调用行数:" + stackTraceElements[0].getLineNumber());
System.out.println("main方法输出1---调用类:" + stackTraceElements[1].getClassName() + ",调用方法:" + stackTraceElements[1].getMethodName() + ",调用行数:" + stackTraceElements[1].getLineNumber());
}
test1();
}
private static void test1 () {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
if (stackTraceElements.length > 2) {
System.out.println("test1方法输出0---调用类:" + stackTraceElements[0].getClassName() + ",调用方法:" + stackTraceElements[0].getMethodName() + ",调用行数:" + stackTraceElements[0].getLineNumber());
System.out.println("test1方法输出1---调用类:" + stackTraceElements[1].getClassName() + ",调用方法:" + stackTraceElements[1].getMethodName() + ",调用行数:" + stackTraceElements[1].getLineNumber());
System.out.println("test1方法输出2---调用类:" + stackTraceElements[2].getClassName() + ",调用方法:" + stackTraceElements[2].getMethodName() + ",调用行数:" + stackTraceElements[2].getLineNumber());
}
test2();
}
private static void test2 () {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
if (stackTraceElements.length > 3) {
System.out.println("test2方法输出0---调用类:" + stackTraceElements[0].getClassName() + ",调用方法:" + stackTraceElements[0].getMethodName() + ",调用行数:" + stackTraceElements[0].getLineNumber());
System.out.println("test2方法输出1---调用类:" + stackTraceElements[1].getClassName() + ",调用方法:" + stackTraceElements[1].getMethodName() + ",调用行数:" + stackTraceElements[1].getLineNumber());
System.out.println("test2方法输出2---调用类:" + stackTraceElements[2].getClassName() + ",调用方法:" + stackTraceElements[2].getMethodName() + ",调用行数:" + stackTraceElements[2].getLineNumber());
System.out.println("test2方法输出3---调用类:" + stackTraceElements[3].getClassName() + ",调用方法:" + stackTraceElements[3].getMethodName() + ",调用行数:" + stackTraceElements[3].getLineNumber());
}
}
}
输出信息:
main方法输出0---调用类:java.lang.Thread,调用方法:getStackTrace,调用行数:1556
main方法输出1---调用类:Test,调用方法:main,调用行数:7
test1方法输出0---调用类:java.lang.Thread,调用方法:getStackTrace,调用行数:1556
test1方法输出1---调用类:Test,调用方法:test1,调用行数:17
test1方法输出2---调用类:Test,调用方法:main,调用行数:12
test2方法输出0---调用类:java.lang.Thread,调用方法:getStackTrace,调用行数:1556
test2方法输出1---调用类:Test,调用方法:test2,调用行数:27
test2方法输出2---调用类:Test,调用方法:test1,调用行数:23
test2方法输出3---调用类:Test,调用方法:main,调用行数:12
根据上面输出的信息可以看出:
堆栈信息中
第零个元素显示的是java的Thead类中getStackTrace()方法的调用处;
第一个元素显示的是当前方法中Thread.currentThread().getStackTrace()处;
第二个元素显示的是当前方法的调用处;
第三个元素显示的是当前方法的调用方法的调用处;
......
通过Thread.currentThread().getStackTrace()方法可以获取当前线程的堆栈信息
通过stackTraceElements[0].getClassName()方法可以获取类名(全限定名,例如java.lang.Thread)
通过stackTraceElements[0].getMethodName()方法可以获取方法名
通过stackTraceElements[0].getLineNumber()方法可以获取行号
通过stackTraceElements[0].getFileName()方法可以获取文件名
通过stackTraceElements[0].getClass()方法可以获取Class
参考博客:https://blog.csdn.net/xsm666/article/details/80823643
浙公网安备 33010602011771号