与Java中的Exception vs Throwable相关联的开销

Why*_*ugo 27 java exception throwable

我知道

throw new Exception();
Run Code Online (Sandbox Code Playgroud)

有一个相当大的开销,因为它创建了一个完整的堆栈跟踪等
是否

throw new Throwable();
Run Code Online (Sandbox Code Playgroud)

出现同样的问题?这种行为是继承的,还是抛出Throwable有一个较小的(o no)开销?

编辑
分析师的角度来看,插入错误密码的用户是程序正常执行顺序的例外.所以,如果我有:

public Session newSession() {  
  validate_user_and_password();   
}
Run Code Online (Sandbox Code Playgroud)

分析师的角度来看,抛出UserNotValidException听起来是正确的.如果您的代码具有相当好的抽象,则
返回null或者0听起来不正确.我只是想知道我是否可以在代码中实现这一点,或者如果我不得不将它留给理论.

编程视点异常与分析师视点异常之间存在很大差异.

注意:我给出了一个非常简单而愚蠢的例子,这不是我的情况.
注2:我知道返回null将是普通的事情,但我需要有适当的抽象和OO代码,而且,就个人而言,我认为没有任何损害.

Asa*_*aph 49

Throwable在创建堆栈跟踪时也会创建堆栈跟踪.来自java文档Throwable:

throwable包含其创建时线程执行堆栈的快照.

因此,就创建堆栈跟踪的开销而言,Exception和之间应该没有区别Throwable.

如果您使用"异常事件"的异常(就像您应该这样),那么您不应该过多关注堆栈跟踪的开销.在运行代码中很少发生异常事件.因此,异常不应以任何重要方式影响正常代码的性能.


aku*_*uhn 37

不,你需要自己的子类来避免这种影响.

Exception ex = new Exception() {
    @Override public Throwable fillInStackTrace() {
        return this; // and do nothing else
    }
};
Run Code Online (Sandbox Code Playgroud)

这会创建一个异常实例,它不会填充堆栈跟踪(创建委托fillInStackTrace实际填充堆栈跟踪的异常),因此创建起来很便宜.

  • 遵守Throwable的API文档. (10认同)
  • HEHEHE,好点......戴上我的律师帽:"但它没有说*完整*信息被记录下来,所以零信息满足这个要求"从工程角度来看这甚至是一个很好的论据:外部客户可能依赖于不获取空对象但不填充堆栈跟踪只是在调用`getStackTrace`时导致空数组,因此它不太可能破坏代码.(嗯,我实际上应该验证最后一点,我甚至不确定,你也可以得到null.) (6认同)
  • 但是你正在打破"这个方法在这个Throwable对象中记录有关当前线程的堆栈帧当前状态的信息." 编辑:但采取点,整洁的把戏! (3认同)
  • Scala在ControlFlowException中使用这种技术来实现`break`. (3认同)