java - 抛出已检查异常与抛出包装的 RuntimeException

标签 java exception runtimeexception

在很多地方,我都会遇到几个检查异常,例如 IOException、ParseException、JSONException 等。我必须做出两个选择 -

  1. 通过在方法签名末尾添加 throws 来引发相同的异常。

  2. 将检查的异常包装在 RuntimeException(或某些自定义实现)中,然后抛出它,以便调用者不必到处添加 throws 子句并检查异常。

在第一种情况下,我必须在任何地方都抛出异常,但我的客户可以通过捕获检查异常并继续工作来决定不死。然而,在第二种情况下,RuntimeException 实际上可能会迫使客户端失败,因为通常人们不会在任何地方捕获 Generic/RuntimeExceptions。此外,使用第二种方法可以更轻松地使用 Java 8 lambda,但它不能很好地处理受检查的异常。

两者中哪一个优于另一个,为什么?有什么首选做法可以遵循吗?

最佳答案

有两种异常:调用中预期的异常和原则上意外的异常(并且应用程序代码可能无法以有意义的方式解决)。对于第一种(例如文件操作的 IOException),受检查的异常(在方法签名末尾带有“抛出”)非常有用。

对于第二种情况,我认为出于您所说的原因将其包装在 RuntimeException 中是可以的(不必在任何地方添加抛出)。所有软件都应该准备好在顶层捕获 RuntimeExceptions 作为“最后一道防线”,或者它们接受 RuntimeException 将结束程序(这对于命令行应用程序来说通常是可以接受的)。

第二种情况的一个例子是缺少必要的配置文件。我会将 IOException 作为 RuntimeException 重新抛出。

顺便说一句,还有第三种经常使用的方法:抛出应用程序特定的异常。例如,此异常可以称为“MyConfigurationException”。我认为这只有在应用程序能够捕获此异常并智能处理它时才有用。

关于java - 抛出已检查异常与抛出包装的 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32682405/

相关文章:

java - 在 Android 中使用 KeyStore 存储 key

java - 在一个类中使用另一个类中的变量 NullpointerException - RunTimeException

java - Android FusedLocationProviderClient问题

java - 搜索从文件中提取的数据,并将其存储到数组中以获取答案。 IO

node.js - 为什么由于 Node.js 中的可执行路径无效而导致 try-catch block 无法捕获 child_process 生成异常?

java - 为什么 Float.parseFloat() 同时抛出 NumberFormatException 和 NullPointerException 而 Integer.parseInt() 只抛出 NumberFormatException?

java - 如何捕获 SWT 事件循环中的未经检查的异常

java - 抛出运行时异常之前的控制台输出

java - JUnit 测试的 Maven 代码覆盖率报告

java - jar 文件的反向依赖