为什么不';您不必显式声明您可能会抛出Java中的一些内置异常吗?

为什么不';您不必显式声明您可能会抛出Java中的一些内置异常吗?,java,exception,Java,Exception,我注意到使用Integer.parseInt()时,您不必用try-catch来包围它,也不必声明该方法可能会抛出异常,尽管它“抛出”了一个NumberFormatException 为什么我不必显式地捕获NumberFormatException或声明我的方法抛出它?NumberFormatException扩展了RuntimeException,您不必显式地处理从RuntimeException继承的任何内容 其他运行时异常包括NullPointerException和IndexOutOfB

我注意到使用
Integer.parseInt()
时,您不必用try-catch来包围它,也不必声明该方法可能会抛出异常,尽管它“抛出”了一个
NumberFormatException


为什么我不必显式地捕获
NumberFormatException
或声明我的方法抛出它?

NumberFormatException扩展了RuntimeException,您不必显式地处理从RuntimeException继承的任何内容

其他运行时异常包括NullPointerException和IndexOutOfBoundsException。这些都是程序员可以避免的事情,如果必须尝试/捕获这些类型的异常,将创建一些非常混乱的代码。

因为这是一个“运行时”异常

运行时异常用于识别编程问题(一个好的程序员可以避免)

选中的异常用于识别环境问题(无论您的程序有多好,都无法避免,例如服务器停机)

你可以读更多关于

实际上,只有一个应该处理(大多数情况下)

有关选中与未选中异常的详细说明,请参阅


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

只是对toolkit答案的一个长评论

检查异常之所以成为问题,是因为它们最终会导致以下代码:

try {
    Something that throws an exception
} catch (Exception e) {}
这是最坏的情况。首先,他们没有记录他们正在捕获异常。这种情况经常发生,而且几乎是由非常愚蠢的已检查异常(如Thread.sleep()上的异常)造成的,它抛出必须捕获的InterruptedException,但99%的时候你根本不在乎是否有

在上面的例子中,如果抛出多个异常,人们往往只捕获“异常”,这一事实使情况更加复杂。这意味着,即使抛出一个关键的未检查异常,它也会被捕获并忽略,从而几乎不可能找到问题

我不止一次参加过这样的团队,他们花了大约一个月的时间试图追踪以这种方式隐藏的bug


这是一个很好的概念,当你加上人类是必须负责任地实施它的人这一事实时,它就变得可怕了

这是对运行时/已检查异常之间差异的错误描述。这根本不是他们之间的区别。您应该捕获
RuntimeException
s,也可以通过在调用方法之前进行额外检查来避免选中的异常。Ex1:
NumberFormatException
是您通常应该捕获的异常。捕获
NumberFormatException
比在将字符串转换为数字之前自己检查字符串的格式要好,因为这样您仍然可以得到一个现在无法捕获的
NumberFormatException
。Ex2:
IOException
是一个被许多API抛出的异常。这可能是我捕获最多的异常,也是我在其他代码中看到的捕获最多的异常。在很多地方,您必须捕获
IOException
或其子类,在某些使用抛出它的API的上下文中,它们永远不会被抛出。Ex3:
IOException
,但第三种情况与#2相反。根据用户的文件系统,通常情况下会发生“未找到文件”异常。然而,尽管是已检查的异常,但从技术上讲,您可以在访问该文件之前检查该文件是否存在,这是一个非常简单的单行程序。比检查
字符串的数字格式容易得多。有很多类似的情况,它们不是规则的例外(没有双关语)。实际上,是否检查异常取决于创建异常的人员的意见。在这一点上,您权衡了已检查异常的烦恼与未检查异常在未检查中滑动的负面后果的概率,并考虑了一些因素,例如开发人员的易用性(例如:打开文件可能会对找不到且必需的
file.exists
用法的文件抛出非法状态,但这很难处理)。
try {
    Something that throws an exception
} catch (Exception e) {}