代码如下:
import java.util.Scanner;
/**
* 代码出自 JAVA核心技术I P-281
*
*/
public class StackTraceTest {
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;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Enter n:");
int n = in.nextInt();
factorial(n);
}
}
在看书《JAVA核心技术 卷1》的时候 P281页看到这个程序,于是照着书本打了一下。
这个例子就是一个简单的递归,然后用getStackTrace()方法获得堆栈的轨迹,然后放在数组当中,遍历出来再打印,来分析堆栈轨迹用的。
代码巡行结果如下:
Enter n:
5
factorial(5):
test4.StackTraceTest.factorial(StackTraceTest.java:12)
test4.StackTraceTest.main(StackTraceTest.java:26)
factorial(4):
test4.StackTraceTest.factorial(StackTraceTest.java:12)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.main(StackTraceTest.java:26)
factorial(3):
test4.StackTraceTest.factorial(StackTraceTest.java:12)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.main(StackTraceTest.java:26)
factorial(2):
test4.StackTraceTest.factorial(StackTraceTest.java:12)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.main(StackTraceTest.java:26)
factorial(1):
test4.StackTraceTest.factorial(StackTraceTest.java:12)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.factorial(StackTraceTest.java:18)
test4.StackTraceTest.main(StackTraceTest.java:26)
return 1
return 2
return 6
return 24
return 120
主要疑问就是打出来这个堆栈的顺序有点不理解。比如:
为什么factorial函数比main先打印出来呢?
按照程序的执行顺序,不应该是率先执行main方法,然后再执行里面的内容么?
在我个人的理解来看,打印顺序应该是这样才对。
test4.StackTraceTest.main(StackTraceTest.java:26)
test4.StackTraceTest.factorial(StackTraceTest.java:12)
但是事实跟我想的不一样 每次都是main方法放在最后。
所以我想问这个到底是为什么呢?