我们知道捕捉异常非常昂贵.但是,即使从未抛出异常,在Java中使用try-catch块是否也很昂贵?

我找到了堆栈溢出问题/答案100,但它是针对.NET的.

推荐答案

try美元几乎没有任何费用.代码的元数据不是在运行时设置try,而是在编译时进行 struct 化,这样当抛出异常时,它现在会执行一个相对昂贵的操作,即遍历堆栈,查看是否存在任何try个块来捕获该异常.从门外汉的Angular 来看,try美元也可能是免费的.它实际上是抛出让你付出代价的异常——但除非你抛出数百或数千个异常,否则你仍然不会注意到代价.


try有一些与之相关的小成本.JAVA不能对try个挡路中的代码进行一些原本会做的优化.例如,Java通常会重新安排方法中的指令,以使其运行得更快-但Java还需要保证,如果抛出异常,则会观察到该方法的执行,就好像其源代码中编写的语句一直按顺序执行到某一行一样.

因为在try块中可以抛出一个异常(在try块的任何一行!一些异常是异步抛出的,例如通过在线程上调用stop(已弃用),甚至除此之外,OutOfMemoryError几乎可以在任何地方发生),但它可以被捕获,代码随后继续以相同的方法执行,更难对可以进行的优化进行推理,因此它们不太可能发生.(需要有人对编译器进行编程来完成这些操作,推理并保证正确性,等等.对于一些"例外"的东西来说,这将是一个巨大的痛苦),但在实践中,你不会注意到这样的事情.

Java相关问答推荐

JPackage-results已安装-如何添加系统属性?

RxJava PublishSubject缓冲区元素超时

JVM会优化这个数学运算吗?

存根基类的受保护方法

将不受支持的时区UT重写为UTC是否节省?

如何找到MongoDB文档并进行本地化?

为什么JAVA&S清洁器使用链表而不是并发HashSet?

为什么Java Annotation接口覆盖对象类中的方法

从Spring5迁移到Spring6:无法在雅加达包中找到类

按属性值从流中筛选出重复项

Spring Data JPA慢慢地创建了太多非活动会话

与不同顺序的组进行匹配,不重复组但分开

无法播放音频:从资源加载库GStreamer-Lite失败

如何处理两个几乎相同的XSD文件?

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

谷歌应用引擎本地服务器赢得';t在eclipse上运行

这是JavaFX SceneBuilder的错误吗?

MapStruct记录到记录的映射不起作用

SonarQube在合并升级到java17后对旧代码提出错误

如何使用命令行为Java应用程序生成烟雾测试用例