java - 我们应该在 Java 中处理未经检查的异常吗?

标签 java exception

我在面试中被问到:

Is it good practice to handle unchecked exceptions with a try-catch block or should we leave them unhandled? Should we write most of our code between try-catch?

寻找一些令人满意的理由...

最佳答案

这取决于我们所指的未经检查的异常。在很多情况下,您可以预见可能会抛出未经检查的异常。我经常捕获未经检查的异常的一个简单示例是 NumberFormatException。如果您可以绝对确定在使用 Integer.parseInt(String) 时该字符串将是一个数字,那么不检查这一点是可以的,但它可能非常罕见,否则为什么不存储它首先是一个Integer?您可能正在获取用户输入的字符串,在这种情况下,可能值得捕获该字符串以以适当的方式处理无效输入(例如要求他们重新输入输入)。

另一方面,有一些未经检查的异常,您应该能够避免捕获这些异常。 ArrayIndexOutOfBoundsException 就是一个例子。在尝试访问数组的一部分之前,您应该确保您知道它可用。这通常可以通过根据您尝试访问的索引检查数组的大小来实现。允许抛出异常然后以“检查”的方式捕获它是低效的,因为创建异常会产生开销。

关于将所有代码包装在 try-catch 中,我不禁感觉到这样的暗示:您期望代码在这样做时会中断,并且您不应该处理您不知道的问题的原因。如果你的意思是从字面上将你的程序包装在 try {...} catch (Exception ex) {...} 中,我看不出它有任何用处,因为你要做的就是 JVM 所做的当异常被一直抛出堆栈时,为你做。您可以做一些处理,也许可以尝试恢复,但尝试恢复什么?如果您只是捕获Exception,您不知道出了什么问题需要恢复。

有时,将代码包装在大型 try-catch 中可能会很有用(如果您不希望系统的一小部分最终破坏整个系统),但总的来说,通常有一些方法可以首先避免这些事情发生,或者更好地处理它们,而不是将其包装在一个巨大的 try-catch 中。

关于java - 我们应该在 Java 中处理未经检查的异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265536/

相关文章:

C++(标准)异常和 Unicode

java - 比较作为映射的键和值的集合的大小

java - 在哪里为在 glassfish 4 中运行的应用程序设置系统变量

Neo4j:用于计算交集多个属性的 Java API

java - 如何使用 iText 在 PDF 文档中设置文本 @ 绝对位置

java - spring-jpa 如何在 find* 查询方法上获取 EntityNotFoundException 或类似的异常?

java - 按行分隔符将字符串拆分为列表?

ruby-on-rails - ActiveRecord#存在吗?或从 ActiveRecord::RecordNotFound 中救援

c# - DataTableReader.GetValue(int) 抛出 ArguementOutOfRangeException

java - (Java) GUI NumberFormatException 捕获异常,但挂起窗口