一、什么是StackTrace
StackTrace(堆栈轨迹)可以认为是一系列方法调用过程的集合。
异常处理中常用的printStackTrace()即为打印异常调用的堆栈信息。
二、StackTraceElement介绍
StackTraceElement表示StackTrace(堆栈轨迹)中的一个元素,属性包括方法调用者的类名、方法名、文件名以及调用的行数。
StackTraceElement被定义为final,可见其作为一个Java的基础类不允许被继承。
获取StackTraceElement的方法有两种,均返回StackTraceElement数组
1、Thread.currentThread().getStackTrace()
2、new Throwable().getStackTrace()
StackTraceElement数组包含了StackTrace(堆栈轨迹)的内容,通过遍历它可以得到方法间的调用过程,
即可以得到当前方法以及其调用者的方法名、调用行数等信息
public class Main {
public static void main(String[] args) {
new Main().methodA();
}
private void methodA() {
System.out.println("------进入methodA----------");
methodB();
}
private void methodB() {
System.out.println("------进入methodB----------");
StackTraceElement elements[] = Thread.currentThread().getStackTrace();
for (int i = 0; i < elements.length; i++) {
StackTraceElement stackTraceElement = elements[i];
String className = stackTraceElement.getClassName();
String methodName = stackTraceElement.getMethodName();
String fileName = stackTraceElement.getFileName();
int lineNumber = stackTraceElement.getLineNumber();
System.out.println("StackTraceElement数组下标 i=" + i + "----------fileName="
+ fileName + "----------className=" + className + "----------methodName=" + methodName + "----------lineNumber=" + lineNumber);
}
}
}
------进入methodA----------
------进入methodB----------
StackTraceElement数组下标 i=0----------fileName=Thread.java----------className=java.lang.Thread----------methodName=getStackTrace----------lineNumber=1479
StackTraceElement数组下标 i=1----------fileName=Main.java----------className=Main----------methodName=methodB----------lineNumber=13
StackTraceElement数组下标 i=2----------fileName=Main.java----------className=Main----------methodName=methodA----------lineNumber=8
StackTraceElement数组下标 i=3----------fileName=Main.java----------className=Main----------methodName=main----------lineNumber=3
StackTraceElement数组下标 i=4----------fileName=NativeMethodAccessorImpl.java----------className=sun.reflect.NativeMethodAccessorImpl----------methodName=invoke0----------lineNumber=-2
StackTraceElement数组下标 i=5----------fileName=NativeMethodAccessorImpl.java----------className=sun.reflect.NativeMethodAccessorImpl----------methodName=invoke----------lineNumber=39
StackTraceElement数组下标 i=6----------fileName=DelegatingMethodAccessorImpl.java----------className=sun.reflect.DelegatingMethodAccessorImpl----------methodName=invoke----------lineNumber=25
StackTraceElement数组下标 i=7----------fileName=Method.java----------className=java.lang.reflect.Method----------methodName=invoke----------lineNumber=597
StackTraceElement数组下标 i=8----------fileName=AppMain.java----------className=com.intellij.rt.execution.application.AppMain----------methodName=main----------lineNumber=147