为什么NumberFormatException是运行时异常?

28

运行时异常表示代码存在错误(例如NPE),如果代码没有错误,则绝不应抛出。它总是指示代码中的错误(与断言相同,但断言用于内部类错误,而运行时异常用于类的客户端错误)。

运行时异常不应该被捕获。

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

尽管如此,我也不明白为什么NumberFormatException是运行时异常?


2
没有代码,没有人能回答这个问题。 - RoflcoptrException
1
就像编译器不知道在对一个空对象进行操作时它是null一样,它也不知道被解析的字符串是否实际上是一个数字。这是一个只会在运行时发生的异常。 - asgs
19
他问的是为什么NumberFormatException是一个运行时异常,而不是他为什么会遇到该异常。 - dee-see
4
其他异常情况也是如此,它们仍然不是RuntimeException。例如,当套接字关闭时读取的IOException异常。我认为这与编译器知道与否无关... - user85421
6个回答

9

首先,告诉你

运行时异常不应该被捕获

的人对Java了解很少。不要听他们的 - 他们是错的。

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

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
}

将其作为运行时的另一个原因是,如果你确信不会出现异常(例如完全信任String数据的来源),它不会用潜在的不必要try/catch块混淆代码。


14
然而,对于一些类似于URLFormatThingyException之类的已检查异常也可以这样说。简而言之,这整个情况有点混乱。 - Bart van Heukelom
2
而且在事先检查之后,也可以这样说NPE! - user85421
1
Integer.parseInt("-1"); // D'oh! - 不要在你的代码中重复解析代码,这样做会打败库的整个目的。空值检查很简单,所以它们是允许的(在一定程度上)。Jörn的答案建议改用文本解析API,这在这种情况下似乎更合适。 - CurtainDog
2
有没有一种合理的方法允许“2147483647”,同时不允许“2147483648”,而不必像解析该值所需的工作那样多? - supercat
6
这个答案使用的逻辑并不令人信服。许多异常情况可以通过手动检查条件来预防,但这在一定程度上违背了该方法的目的。一方面,它需要精确重新实现方法内部的检查(因此违反了封装),另一方面,它增加了无用的运行时开销。我能够想象到的是,Java设计者认为这个例子是一个边界情况(可能是程序错误),并且知道始终存在的检查异常的烦恼,因此决定不使用它们。 - TheOperator
显示剩余7条评论

2

NumberFormatException 可能在解析配置文件时抛出,这种情况下属于程序员错误。当解析用户输入时,通常使用会抛出已检查的 ParseExceptionNumberFormat


1
配置文件并不总是(甚至很少)由程序员控制,但我认为你的观点很好。Java库提供了处理来自可信源和不可信源输入的不同API。 - CurtainDog
是的!很幸运找到了这个答案,这解释了为什么NumberFormat会抛出一个受检查的ParseException,而Integer.parseInt会抛出一个运行时异常。关于配置文件的好点子,我相信这正是它的设计和使用方式 - NumerFormat用于用户输入,Integer.parseInt用于其他所有情况。 - Peter Perháč

1

NumberFormatException是IllegalArgumentException的子类。这是一个运行时异常的原因是,完全有可能违反接受String并返回Number的方法的契约。如果我传入123D,而数据没有得到适当的验证,那么这将是一个合适的非法参数。


-1
为什么NumberFormatException是运行时错误?如果您有一个对话框,用户输入一个值,而该值不是数字但被解析为数字,则您需要知道这一点。异常是否是最好的方式?也许不是,但它就是它。

5
我认为这个问题是关于它作为RuntimeException子类而不是简单的Exception,也就是不属于checked exception的问题。 - user85421

-2
从某种意义上说,NumberFormatException是一种编译时异常。但它不是由Java编译器抛出的,而是在程序运行时由格式化字符串解析器/编译器抛出的。同样适用于Pattern和其他正则表达式的使用方式;你的程序正在运行解析器/编译器。

-2

我认为运行时异常是指计算机硬件执行某个操作后,意识到这是不可能的,因此无法回退并抛出异常,导致程序崩溃。例如数字格式异常,计算机试图将字符串读取为整数。硬件尝试将字符存储在整数变量中,这是不可能的。基本上任何涉及硬件的事情,比如除以0。


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