gpt4 book ai didi

java - 为什么我可以 "fake"Java 异常的堆栈跟踪?

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:00 25 4
gpt4 key购买 nike

如果我运行以下测试,它会失败:

public class CrazyExceptions {
private Exception exception;

@Before
public void setUp(){
exception = new Exception();
}

@Test
public void stackTraceMentionsTheLocationWhereTheExceptionWasThrown(){
String thisMethod = new Exception().getStackTrace()[0].getMethodName();
try {
throw exception;
}
catch(Exception e) {
assertEquals(thisMethod, e.getStackTrace()[0].getMethodName());
}
}
}

出现以下错误:

Expected :stackTraceMentionsTheLocationWhereTheExceptionWasThrown
Actual :setUp

堆栈跟踪只是平淡无奇。

为什么在抛出异常时不重写堆栈跟踪?我不是 Java 开发人员,也许我在这里遗漏了一些东西。

最佳答案

堆栈跟踪是在异常被实例化时创建的,而不是在它被抛出时创建的。这是 Java Language Specification 的指定行为

20.22.1  public Throwable()

This constructor initializes a newly created Throwable object with null as
its error message string. Also, the method fillInStackTrace (§20.22.5) is
called for this object.

....

20.22.5 public Throwable fillInStackTrace()

This method records within this Throwable object information about the
current state of the stack frames for the current thread.

我不知道他们为什么那样做,但如果规范这样定义它,它至少在所有各种 Java VM 上都是一致的。

但是,您可以通过手动调用 exception.fillInStackTrace() 来刷新它。

另请注意,您应该使用 Thread.currentThread().getStackTrace() 而不是使用 new Exception().getStackTrace()(糟糕的风格)。

关于java - 为什么我可以 "fake"Java 异常的堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1696765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com