分析堆栈跟踪元素
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出现的位置很清晰对开发维护成本可以提高。