Why can I “fake” the stack trace of an exception in Java?

后端 未结 6 855
梦如初夏
梦如初夏 2021-02-19 10:39

If I run the following test, it fails:

public class CrazyExceptions {
    private Exception exception;

    @Before
    public void setUp(){
        exception =          


        
6条回答
  •  你的背包
    2021-02-19 11:18

    The stack trace is created when the exception is instantiated, not when it is thrown. This is specified behaviour of the 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. 
    

    I don't know why they did it that way, but if the specification defines it like that, it is at least consistent on all the various Java VMs.

    However, you can refresh it by calling exception.fillInStackTrace() manually.

    Also note that you should use Thread.currentThread().getStackTrace() instead of using new Exception().getStackTrace() (bad style).

提交回复
热议问题