这假设我们不调用.printstacktrace方法 - 只是抛出和捕获。
我们正在考虑这是一些性能瓶颈。
答案 0 :(得分:13)
不,在构造异常对象时生成堆栈跟踪,而不是在抛出异常对象时生成堆栈跟踪。 Throwable()构造函数调用fillInStackTrace()。 (至少在Sun / Oracle的JDK 6 for Windows中。)
答案 1 :(得分:7)
构造异常时捕获Stacktrace。
如果你真的不关心堆栈跟踪,你可以构造一次异常并多次抛出它,但它看起来像是一个黑客,可能会让人感到困惑。
答案 2 :(得分:4)
如果要打印,Throwable对象会捕获当前堆栈(使用本机代码)。这就是为什么异常不应该(ab)用于控制流程的原因。
答案 3 :(得分:2)
当调用printStackTrace()方法
时,它不会延迟构建Neal Gafter(构建Java的团队的前Sun工程师)提到异常性能here:
异常中最昂贵的部分 处理到目前为止正在捕获堆栈 创建异常时跟踪
另请参阅this question。
答案 4 :(得分:0)
仅供参考。您可以重载fillInStackTrace以避免性能下降。当我们想要某些我们不关心堆栈跟踪的异常时,我们在twitter上执行此操作。
play框架也在play 1.3.x行中执行此操作。
此外,您可以断点fillInStackTrace来查看它是否在构造中完成。