即使从不抛出异常,使用try-catch块是否昂贵?

即使从不抛出异常,使用try-catch块是否昂贵?

我们知道捕获异常是昂贵的。但是,即使从未抛出异常,在Java中使用try-catch块也是昂贵的吗?

我发现Stack Overflow问题/答案为什么尝试块昂贵?,但它适用于.NET


慕哥6287543
浏览 778回答 3
3回答

慕丝7291255

try几乎没有任何费用。try代码的元数据不是在运行时进行设置,而是在编译时进行结构化,这样当抛出异常时,它现在会执行相对昂贵的操作,即向上移动堆栈并查看是否try存在任何可以捕获此异常的块例外。从外行的角度来看,try也许是免费的。它实际上抛出了让你付出代价的例外 - 但除非你抛出数百或数千例外,否则你仍然不会注意到成本。try有一些与之相关的小成本。Java不能对try块中的代码进行一些优化,否则它会执行。例如,Java通常会在方法中重新排列指令以使其运行得更快 - 但Java还需要保证如果抛出异常,就会观察到方法的执行,就好像它的语句一样,在源代码中执行,执行按顺序排队。因为在一个try块中可以抛出异常(在try块的任何一行!异步抛出一些异常,例如通过调用stop一个Thread(不推荐使用),甚至OutOfMemoryError几乎可以在任何地方发生)然而它可以捕获并且代码在之后以相同的方法继续执行,更难以推断可以进行的优化,因此它们不太可能发生。(有人必须对编译器进行编程才能完成它们,推理并保证正确性等等。对于那些意味着'特殊'的事情来说,这将是一件巨大的痛苦。)但是,实际上你不会注意到这样的事情。

红颜莎娜

try/ catch可能会对性能产生一些影响。这是因为它阻止JVM进行一些优化。Joshua Bloch在“Effective Java”中说过以下内容:•将代码放在try-catch块中会禁止现有JVM实现可能执行的某些优化。
打开App,查看更多内容
随时随地看视频慕课网APP