为什么在Java中不需要显式声明可能会抛出一些内置异常?

7
我注意到使用Integer.parseInt()时,即使它会抛出NumberFormatException异常,我也不必在代码中加入try-catch语句或声明方法可能会抛出异常。
为什么我不必显式捕获NumberFormatException异常或声明我的方法会抛出该异常呢?
4个回答

16

因为这是一个"运行时"异常。

RuntimeExceptions用于识别编程问题(一个好的程序员可以避免这些问题),而

Checked exceptions用于识别环境问题(无论您编写多好的程序,例如服务器宕机,也无法避免)

您可以在这里了解更多信息

实际上有三种类型的异常,只有其中一种应该被处理(大多数情况下)


那个描述运行时异常和检查异常之间差别的说法很不准确,根本就不是它们之间的区别。有些 RuntimeException 是必须要捕获的,而有些检查异常则可以在调用方法前进行额外的检查以避免。 - Loduwijk
NumberFormatException 是一个通常应该捕获的异常。在将字符串转换为数字之前,尝试检查其格式不如捕获 NumberFormatException 更好,因为这样你仍然可能会遇到未捕获的 NumberFormatException 异常。 - Loduwijk
IOException 是许多 API 中经常抛出的异常之一。对我来说,这可能是最常见的异常,也是我在他人代码中看到的最常见的异常。有很多地方你被迫捕获 IOException 或其子类,但在使用抛出它的 API 的某些上下文中,它永远不会被抛出。 - Loduwijk
Ex3:再次是 IOException,但这种第三类型的情况与#2相反。文件未找到异常通常是根据用户的文件系统有时会发生的异常。然而,尽管它是一个被检查异常,但在访问文件之前技术上可以检查文件是否存在,并且这样做非常简单(只需要一行代码)。比检查 String 的数字格式要容易得多。 - Loduwijk
这样的情况有很多,并不是例外(无意挖苦)。实际上,异常是被检查还是未经检查完全取决于创建异常的人的意见。在那时,您需要权衡已检查异常的烦恼与未捕获的未经检查的异常带来的负面后果的概率,并考虑一些开发人员易用性的因素(例如:打开文件可能会在找不到文件时抛出非法状态并要求使用File.exists,但这很笨重)。 - Loduwijk
@Aaron 虽然我不完全反对你在这里添加的所有评论,而且自从我7年前回答这个问题以来,很多事情已经发生了变化,但是如果你把它们放在一个单独的答案中,那么可能会更有益处,这样到达这个页面的人可以找到它们有用。这是一个7年前的答案,现在我更喜欢在可能的情况下使用运行时异常。然而,这个答案仍然是正确的。 - OscarRyz

7
         Throwable
         /      \
      Error    Exception
                /     \
           *checked*  RuntimeException
                            \
                         *unchecked*

参见《Java编程思想》对已检查异常和未检查异常的详细解释。

有些人认为已检查异常是一个失败的实验。例如,Spring和Hibernate都使用未检查异常,并经常将已检查异常包装成未检查版本。


6

NumberFormatException是RuntimeException的子类,您不必显式地处理任何继承自RuntimeException的异常。

其他的RuntimeException包括NullPointerException和IndexOutOfBoundsException。这些都是程序员可以避免的问题,如果必须要try/catch这些类型的异常,会导致代码非常混乱。


2

这只是对工具包答案的长评论。

检查异常成为问题的原因在于它们最终会导致以下代码:

try {
    Something that throws an exception
} catch (Exception e) {}

这是最糟糕的情况。首先,他们没有记录捕获异常的情况。这种情况经常发生,并且几乎被非常愚蠢的检查异常所迫使,例如Thread.sleep()上的异常,它抛出InterruptedException必须被捕获,但99%的情况下,你根本不在意是否得到了一个。

在上述情况中,问题变得更加严重的是,人们倾向于只捕获“Exception”,如果有多个异常抛出。这意味着即使抛出关键的未检查异常,也会被捕获并忽略,使得找到问题几乎不可能。

我曾经参与过的团队不止一次花费了大约一个月的时间来跟踪隐藏在这种方式中的错误。

这是一个好的概念,但当你考虑到人类必须负责实现它时,它就变得可怕了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接