當你維護別人的代碼時候,會發現某個方法被代碼多處調用,如果你想知道該方法是從那一個地方調用過來的,可以在這個方法中打印該方法在程序運行是棧中的調用順序。
代碼片段如下:
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.UnknownHostException;
public class TestForStack {
public static void main(String[] args) {
new TestForStack().f();
}
private void a() {
Throwable t = new Throwable();
t.fillInStackTrace();
System.out.println(getStackTraceString(t));
}
private void b() {
a();
}
private void c() {
b();
}
private void d() {
c();
}
private void e() {
d();
}
private void f() {
e();
}
public static String getStackTraceString(Throwable tr) {
if (tr == null) {
return "";
}
Throwable t = tr;
while (t != null) {
if (t instanceof UnknownHostException) {
return "";
}
t = t.getCause();
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
tr.printStackTrace(pw);
return sw.toString();
}
}
我打印了方法a()在程序運行中的調用順序,運行結果如下:
java.lang.Throwable
at com.pinguo.android.csdn.TestForStack.a(TestForStack.java:14)
at com.pinguo.android.csdn.TestForStack.b(TestForStack.java:19)
at com.pinguo.android.csdn.TestForStack.c(TestForStack.java:23)
at com.pinguo.android.csdn.TestForStack.d(TestForStack.java:27)
at com.pinguo.android.csdn.TestForStack.e(TestForStack.java:31)
at com.pinguo.android.csdn.TestForStack.f(TestForStack.java:35)
at com.pinguo.android.csdn.TestForStack.main(TestForStack.java:9)
結果顯示調用的順序是從下而上。