理解抛出的异常

时间:2017-12-15 11:19:43

标签: java exception-handling stack-unwinding

在讨论和一些关于使用异常与返回值的研究中,以下内容引起了我的注意:

  

它更便宜并且提供更好的性能来返回值,而抛出异常需要创建一个新对象和堆栈展开。

现在,我读到堆栈展开,根据我的理解,这是在跳回到堆栈上的下一帧之前释放当前堆栈帧上所有已分配资源的突然过程。特别是在Java中,没有资源被释放,而是当前在范围内的所有对象都被取消引用并且符合GC的条件。另一方面,在优雅返回的情况下,由于超出范围,对象立即被销毁。

问题是:

有一个声明了少量实例的方法(例如3)并假设如果抛出异常,它将被捕获到下一级别(例如它不会爬上5个堆栈级别),是否存在真的很明显(不确定这是否是正确使用的词)与返回值相比,性能明智吗?我知道在一天结束的时候,在一个简单的场景中,没有明显的区别,但是可能会导致更大系统中的一个吗?

请假设在方法中抛出异常是有意义的(这是一种特殊情况)并且它不适用于控制流(这是一个已知的错误)。仅出于性能原因,返回值将是首选。

1 个答案:

答案 0 :(得分:0)

考虑到要创建异常的Stacktrace,java不只是回到直接调用者。 Java一直上升到根堆栈。因此,根据您的小方法运行的深度,创建Stacktrace可能会很昂贵。

另请注意这个问题:Which part of throwing an Exception is expensive?