堆栈轨迹( stack trace ) 是一个方法调用过程的列表, 它包含了程序执行过程中方法调用
的特定位置前。
eg:
package com.v1ch07.stackTrace;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.*;
public class StackTraceTest
{
/**
* Computes the factorial of a number
* @param n a non-negative integer
* @return n! = 1 * 2 * . . . * n
*/
public static int factorial(int n)
{
System.out.println("factorial(" + n + "):");
// printStackTrace();
// printStackTrace2();
printStackTrace3();
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.print("Enter n: ");
int n = in.nextInt();
factorial(n);
}
/**
* 调用 Throwable 类的 printStackTrace 方法访问堆栈轨迹的文本描述信息
*/
public static void printStackTrace()
{
Throwable t = new Throwable();
StringWriter out = new StringWriter();
t.printStackTrace(new PrintWriter(out));
System.out.println(out.toString());
}
/**
* 使用 getStackTrace 方法, 它会得到 StackTraceElement 对象的一个数组
*
*/
public static void printStackTrace2()
{
Throwable t = new Throwable();
StackTraceElement[] frames = t.getStackTrace();
for (StackTraceElement f : frames)
System.out.println(f);
}
/**
* 静态的 Thread.getAllStackTrace 方法, 它可以产生所有线程的堆栈轨迹 。
*/
public static void printStackTrace3()
{
Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
for (Thread t : map. keySet ()) {
StackTraceElement[] frames = map.get(t);
for (StackTraceElement f : frames)
System.out.println(f);
}
}
}