0

在讨论和一些关于使用异常与返回值的研究期间,我想到了以下几点:

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

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

问题是这样的:

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

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

4

1 回答 1

0

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

还要注意这个问题:抛出异常的哪一部分是昂贵的?

于 2017-12-16T09:12:26.797 回答