StackTraceElement用法

一、什么是StackTrace

StackTrace(堆栈轨迹)可以认为是一系列方法调用过程的集合。

异常处理中常用的printStackTrace()即为打印异常调用的堆栈信息。

二、StackTraceElement介绍

StackTraceElement表示StackTrace(堆栈轨迹)中的一个元素,属性包括方法调用者的类名、方法名、文件名以及调用的行数。

[java]  view plain  copy
  1. public final class StackTraceElement implements java.io.Serializable {  
  2.     // Normally initialized by VM (public constructor added in 1.5)  
  3.     private String declaringClass;  
  4.     private String methodName;  
  5.     private String fileName;  
  6.     private int    lineNumber;  

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值