为什么我可以“伪造” Java中异常的堆栈跟踪?

R.马丁尼奥·费尔南德斯(Martinho Fernandes):

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

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语言规范的指定行为

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()(不良样式)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

有没有一种方法可以在不引发Java异常的情况下转储堆栈跟踪?

来自分类Java

Java堆栈跟踪中的“消除”是什么意思?

来自分类Java

为什么异常堆栈跟踪未登录?

来自分类Java

为什么我可以在Java中抛出null?

来自分类Java

Java中没有堆栈跟踪的异常

来自分类Java

为什么Android Logcat不显示运行时异常的堆栈跟踪?

来自分类Java

我如何在Java中将堆栈跟踪添加到调试打印输出中

来自分类Java

用Java伪造堆栈跟踪

来自分类Java

Java:为什么我不能在Comparator中抛出异常?

来自分类Java

如何在Java ME中获取异常堆栈跟踪的文本?

来自分类Java

为什么在多次重复相同的异常后,log4j会禁用堆栈跟踪?

来自分类Java

为什么方法在异步嵌套的异常堆栈跟踪中没有出现两次?

来自分类Java

为什么我使用java.lang.Throwable#getStackTrace和java.lang.Thread#getStackTrace获得不同的堆栈跟踪

来自分类Java

Java堆栈跟踪中的代字号(〜)是什么意思?

来自分类Java

我为什么要关心Java中捕获的异常?

来自分类Dev

为什么在处理Action的方法中截断堆栈跟踪?

来自分类Dev

为什么我的堆栈跟踪缺少步骤?

来自分类Dev

为什么我可以在Ruby中访问数组中的常量?

来自分类Dev

Elixir / Phoenix:为什么某些文件/行未显示在我的异常堆栈跟踪中?

来自分类Dev

为什么这样工作?我不明白为什么我的代码可以在C中工作

来自分类Dev

为什么我不能在方法中引发异常(Java)

来自分类Dev

没有我的代码在堆栈跟踪中的System.Runtime.CompilerServices.AsyncServices中的异常

来自分类Dev

为什么我的堆栈跟踪被截断?

来自分类Dev

为什么我在Java中得到异常mergesort?

来自分类Dev

我可以在Ruby测试中伪造调用方法吗?

来自分类Dev

为什么在我的单页应用程序中获取错误没有堆栈跟踪?

来自分类Dev

为什么默认配置的spring webflux中没有异常堆栈跟踪?

来自分类Dev

我怎样才能在 C# 中只获得异常堆栈跟踪消息的第一行?

来自分类Dev

为什么最后打印了异常的堆栈跟踪?

Related 相关文章

  1. 1

    有没有一种方法可以在不引发Java异常的情况下转储堆栈跟踪?

  2. 2

    Java堆栈跟踪中的“消除”是什么意思?

  3. 3

    为什么异常堆栈跟踪未登录?

  4. 4

    为什么我可以在Java中抛出null?

  5. 5

    Java中没有堆栈跟踪的异常

  6. 6

    为什么Android Logcat不显示运行时异常的堆栈跟踪?

  7. 7

    我如何在Java中将堆栈跟踪添加到调试打印输出中

  8. 8

    用Java伪造堆栈跟踪

  9. 9

    Java:为什么我不能在Comparator中抛出异常?

  10. 10

    如何在Java ME中获取异常堆栈跟踪的文本?

  11. 11

    为什么在多次重复相同的异常后,log4j会禁用堆栈跟踪?

  12. 12

    为什么方法在异步嵌套的异常堆栈跟踪中没有出现两次?

  13. 13

    为什么我使用java.lang.Throwable#getStackTrace和java.lang.Thread#getStackTrace获得不同的堆栈跟踪

  14. 14

    Java堆栈跟踪中的代字号(〜)是什么意思?

  15. 15

    我为什么要关心Java中捕获的异常?

  16. 16

    为什么在处理Action的方法中截断堆栈跟踪?

  17. 17

    为什么我的堆栈跟踪缺少步骤?

  18. 18

    为什么我可以在Ruby中访问数组中的常量?

  19. 19

    Elixir / Phoenix:为什么某些文件/行未显示在我的异常堆栈跟踪中?

  20. 20

    为什么这样工作?我不明白为什么我的代码可以在C中工作

  21. 21

    为什么我不能在方法中引发异常(Java)

  22. 22

    没有我的代码在堆栈跟踪中的System.Runtime.CompilerServices.AsyncServices中的异常

  23. 23

    为什么我的堆栈跟踪被截断?

  24. 24

    为什么我在Java中得到异常mergesort?

  25. 25

    我可以在Ruby测试中伪造调用方法吗?

  26. 26

    为什么在我的单页应用程序中获取错误没有堆栈跟踪?

  27. 27

    为什么默认配置的spring webflux中没有异常堆栈跟踪?

  28. 28

    我怎样才能在 C# 中只获得异常堆栈跟踪消息的第一行?

  29. 29

    为什么最后打印了异常的堆栈跟踪?

热门标签

归档