当你维护别人的代码时候,会发现某个方法被代码多处调用,如果你想知道该方法是从那一个地方调用过来的,可以在这个方法中打印该方法在程序运行是栈中的调用顺序。
代码片段如下:
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)
结果显示调用的顺序是从下而上。