Java 为什么NumberFormatException是运行时的?

Java 为什么NumberFormatException是运行时的?,java,exception,numberformatexception,Java,Exception,Numberformatexception,运行时异常表示契约破裂(如NPE),如果代码没有错误,就永远不应该抛出。它始终指示代码中的错误(与断言相同,但断言用于内部类错误,而运行时用于类的客户端错误) 永远不应该捕获运行时异常 另一方面,选中的异常是签名的一部分,应该捕获和处理。它们可能表示用户输入错误或外部资源问题(如IOException) 有了所有这些,我不明白为什么NumberFormatException是运行时错误?为什么NumberFormatException是运行时错误?如果您有一个对话框,用户在其中输入一个值,而该值

运行时异常表示契约破裂(如NPE),如果代码没有错误,就永远不应该抛出。它始终指示代码中的错误(与断言相同,但断言用于内部类错误,而运行时用于类的客户端错误)

永远不应该捕获运行时异常

另一方面,选中的异常是签名的一部分,应该捕获和处理。它们可能表示用户输入错误或外部资源问题(如
IOException


有了所有这些,我不明白为什么
NumberFormatException
是运行时错误?

为什么NumberFormatException是运行时错误?如果您有一个对话框,用户在其中输入一个值,而该值不是一个数字,而是被解析为数字,那么您可能想知道这一点。例外是最好的方式吗?也许不是,但事实就是这样。

首先,是谁告诉你的

永远不要捕获运行时异常

他对Java知之甚少。别听他们的,他们错了

NumberFormatException是运行时异常:选择未检查的异常是因为它们指示编程错误。例如,在调用之前可以知道字符串是有效的整数,例如,这里只有一种方法:

if (str.matches("^\\d{1,8}$") {
    int myInt = Integer.parseInt(str); // will never throw NumberFormatException 
}
因此,如果程序员选择不先检查,则可能会被视为编程错误

如果您对要解析的字符串的完整性/质量没有信心,那么很容易发现:

try {
    // parse your string
} catch (NumberFormatException e) {
    // do something about it
}

使其成为运行时的另一个原因是,如果您确信不会得到一个块,例如完全信任字符串数据的源,它就不会用可能不必要的
try/catch
块使代码混乱。

NumberFormatException扩展了IllegalArgumentException。这是一个运行时异常的原因是,完全有可能破坏一个方法的契约,该方法使用
字符串
,并返回一个
数字
。如果我传入
123D
,并且没有正确的数据验证,那么这将是一个适当的非法参数

解析配置文件时也可能引发NumberFormatException,在这种情况下,这将是程序员错误。解析用户输入时,通常使用
NumberFormat
,它会抛出一个选中的
ParseException

NumberFormatException
在某种意义上是一个编译时异常。但它不是由Java编译器抛出的,而是在程序运行时由格式字符串解析器/编译器抛出的。这同样适用于
模式
和正则表达式的其他用途;您的程序正在运行解析器/编译器。

我认为运行时异常发生在计算机硬件执行操作时,然后意识到这是不可能的,因此返回并抛出异常为时已晚,因此程序崩溃。例如,对于数字格式异常,计算机尝试将字符串读取为int。硬件尝试将字符存储在int变量中,这是不可能的。基本上,任何涉及硬件的东西,比如没有代码的0除法,没有人能回答这个问题。就像编译器在对某个对象进行操作时不知道该对象为空一样,它不知道解析的字符串是否是一个数字。这是一个只有在运行时才会发生的异常。@Roflcoptr:他问的是为什么NumberFormatException是一个运行时异常,而不是为什么他会得到一个异常。@asgs-其他异常也是如此,它们仍然不是运行时异常。示例IOException,读取时套接字关闭。我不认为这与编译器知道或不知道的内容有关……但是,对于一些已检查的异常,如
urlformathingyexception
以及您所拥有的内容,也可以这样说。简言之,这一切都有点混乱。同样的-事先检查-也可以说关于NPE!绝对地我总是检查NPE:
如果(str!=null&&…
etcIs,那么有什么方法可以合理地允许“2147483647”而不允许“2147483648”,而不必做简单解析值所需的工作?这个答案中使用的逻辑没有说服力。但是,通过事先手动检查条件可以防止许多异常,这在一定程度上违背了方法的目的。一方面,它需要精确地重新实现方法的内部检查(因此违反了封装),另一方面,它增加了无用的运行时成本。相反,我可以想象的是,Java设计人员将此示例视为一个边界情况(可能是编程错误),并意识到经常出现的检查异常的烦扰,决定反对它们。我相信问题在于它是RuntimeException的一个子类,而不是一个简单的异常,配置文件并不总是(甚至经常)在程序员的控制之下,但我认为你的观点是正确的。Java库为处理来自可信源的输入和来自不可信源的输入提供了不同的API。是的!幸运的是找到了这个答案,这就解释了为什么NumberFormat会引发选中的ParseException,而Integer.parseInt会引发运行时异常。配置文件的优点在于,我完全相信它是如何设计和使用的——NumerFormat用于用户输入,Integer.parseInt用于所有其他内容