分析堆栈跟踪元素

package com.tsjt.exception.stack;

import java.util.Scanner;

public class StackTraceTest {
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter n: ");
        int n = in.nextInt();
        factorial(n);
    }
    
    public static int factorial(int n)
    {
        System.out.println("factorial("+n+"):");
        Throwable t = new Throwable();
        StackTraceElement[] frames = t.getStackTrace();
        for (StackTraceElement f : frames) {
            System.out.println(f);
        }
        int r;
        if(n<=1)r=1;
        else r = n*factorial(n-1);
        System.out.println("return "+r);
        return r;
    }

}

通过eclipse控制台输入
 

Enter n: 1
factorial(1):
com.tsjt.exception.stack.StackTraceTest.factorial(StackTraceTest.java:17)
com.tsjt.exception.stack.StackTraceTest.main(StackTraceTest.java:11)
return 1

 通过结果我们来看下堆栈跟踪顺序

com.tsjt.exception.stack.StackTraceTest.factorial(StackTraceTest.java:17)
com.tsjt.exception.stack.StackTraceTest.main(StackTraceTest.java:11)

上面两行控制台结果是通过下面代码输出的。

Throwable t = new Throwable();
		StackTraceElement[] frames = t.getStackTrace();
		for (StackTraceElement f : frames) {
			System.out.println(f);
		}

我们看下为什么看能输出这两行代码呢?请看下图就明白了。

总结:通过分析堆栈跟踪元素可以看出异常对象Throwable可以得出StackTraceElement[] frames = t.getStackTrace();

而StackTraceElement这对象可以得出:

               堆栈所在的对象类路径   declaringClass "com.tsjt.exception.stack.StackTraceTest"    

               堆栈所在的文件名  fileName "StackTraceTest.java"

               堆栈跟踪的代码行数 lineNumber 17 

                堆栈所调用的方法名 methodName "factorial"

通过这些我们可以看出把异常对象Throwable运用好对我们系统bug出现的位置很清晰对开发维护成本可以提高。

原文地址:https://www.cnblogs.com/fofawubian/p/3360554.html