与 Java 中的异常与可抛出相关的开销

2022-09-01 14:54:13

我知道

throw new Exception();

有一个相当大的开销,因为它创建了一个完整的堆栈Trace,等等。

throw new Throwable();

出现同样的问题?此行为是遗传的,还是抛出 Throwable 的开销较小(o 不)?

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

public Session newSession() {  
  validate_user_and_password();   
}

分析师的角度来看,抛出UserNotValidException听起来是正确的。
返回或听起来不正确,如果你的代码有非常好的抽象。我只是想知道我是否真的可以在代码中实现它,或者我是否必须把它留给理论。null0

编程视点异常和分析师视点异常之间有很好的区别。

注意:我举了一个非常简单和愚蠢的例子,这不是我的情况。
注意2:我知道返回将是一件普通的事情,但我需要有适当的抽象和OO代码,而且,就我个人而言,我认为这没有什么坏处。null


答案 1

Throwable还会在创建堆栈跟踪时创建堆栈跟踪。来自 Throwable 的 java 文档

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

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

如果您为“异常事件”使用例外(您应该如此),那么您不应该太担心堆栈跟踪的开销。异常事件在运行代码中很少发生。因此,异常不应以任何显著的方式影响正常代码的性能。


答案 2

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

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

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