为什么getStackTrace()在此Java代码中返回不同的地址?

时间:2016-01-24 17:41:05

标签: java stack-trace

我有以下简单的java代码:

try { -
    ProcessBuilder pb = new ProcessBuilder("TheBatchFile.bat", "Argument1", "Argument2");
    pb.directory(new File("/path/to/working/dir"));
    Process p = pb.start();
    p.waitFor();

} catch ( IOException e) {

    System.out.println(Thread.currentThread().getStackTrace());
    System.out.println("Heres some line");
    System.out.println(e.getStackTrace() ) ;

    System.out.println (" Print-Statement After StackTrace");
}

然后当我连续两次运行它时,它将返回不同的结果。这是输出:

[Ljava.lang.StackTraceElement;@fe64b9
Heres some line
[Ljava.lang.StackTraceElement;@186db54
 Print-Statement After StackTrace

我很好奇这里发生了什么 - 为什么会这样,即使我已经编译了它,并且我运行相同的代码,它仍会为getStackTrace()提供不同的结果

1 个答案:

答案 0 :(得分:3)

getStackTrace()方法在Throwable类(所有Exception的超类中)中定义为:

public StackTraceElement[] getStackTrace() {
    return getOurStackTrace().clone();
}

因此,每次调用它(无论是使用Exception#getStackTrace()还是使用Thread#getStackTrace()),它最终都会返回一个新对象。因此,预计会打印一个新的哈希码。