我们知道捕获异常的成本很高。但是,即使从未抛出异常,在 Java 中使用 try-catch 块是否也很昂贵?
try几乎没有任何费用。代码的元数据不是在运行时进行设置的工作,而是try在编译时构建的,这样当抛出异常时,它现在会执行一个相对昂贵的操作,即向上走栈并查看是否try存在任何可以捕获此异常的块例外。从外行的角度来看,还不try如自由。它实际上是抛出了让你付出代价的异常——但除非你抛出数百或数千个异常,否则你仍然不会注意到成本。
try
try有一些与之相关的小成本。Java 无法对try块中的代码进行一些优化,否则它会这样做。例如,Java 经常会重新安排方法中的指令以使其运行得更快——但 Java 还需要保证,如果抛出异常,该方法的执行被观察到就好像其在源代码中编写的语句被执行一样为了达到某些线。
因为在try块中可以抛出异常(在 try 块中的任何行!一些异常是异步抛出的,例如通过调用stopThread (已弃用),甚至除此之外 OutOfMemoryError 几乎可以在任何地方发生),但它可以被捕获并且代码在之后以相同的方法继续执行,因此更难以推理可以进行的优化,因此它们不太可能发生。(有人必须对编译器进行编程来执行它们,推理并保证正确性等。对于意味着“异常”的东西来说,这将是一个很大的痛苦)但同样,在实践中你不会注意到这样的事情。
stop