在 Java 中比较已检查和未检查的异常(性能、基准)

Comparing checked and unchecked exceptions (Performance, Benchmarks) in Java

在某些情况下,您可以争辩说,当创建异常时,可以使用已检查的异常和未检查的异常吗?然后速度和性能可以相互比较

从性能的角度来看,为异常构建堆栈跟踪无论如何是生成异常时最长的操作 (details)。

已检查和未检查的异常仅在编译时有所不同。 Java 编译器强制您捕获已检查的异常或在方法签名中声明它们。它本应提高程序安全性,但大多数人的意见似乎是它不值得它造成的设计问题。

甚至还有 Lomboks "magical" @SneakyThrows 注释来克服这种编译时检查。在 JVM(class 文件)级别,无论您的方法的 throws 子句如何,都可以抛出所有异常,无论是否检查,这就是它起作用的原因。

正如其他人所说,检查异常和未检查异常之间没有性能差异。

但是如果您认为抛出或处理异常的性能可能对您的应用程序很重要,那您就大错特错了

异常旨在告诉您的调用者您的方法无法完成其任务。如果这种情况经常发生,以至于影响了程序的整体性能,那么您遇到的问题不仅仅是性能问题——您的程序无法运行!

当你发现一个方法不能完成它的任务时总是抛出异常,并且只在你可以合理地继续的地方捕获异常,即使在你的调用堆栈深处嵌套的某个方法的一些未指定的失败之后(这就是异常告诉你) - 通常,这是一些顶级(例如桌面应用程序的菜单栏操作)。为了避免编写大量 throws 类,未经检查的异常可能会有所帮助 - 但这是基于意见的。

抛出异常是非常昂贵的,因为您需要计算所有堆栈跟踪,因为它通常对性能有帮助 return null/-1/etc。 或者您可以使用不带 writableStackTrace 的 Exception 的构造函数。它是构造函数中的最后一个参数。 https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html

protected Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)