为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常?

96
为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常?
这是历史原因还是故意的呢?文档明确说明Double.parseDouble(...)有两种异常类型,而Integer.parseInt()只有一种,但它们似乎不一致。
Integer.parseInt(null); // throws java.lang.NumberFormatException: null

然而

Double.parseDouble(null); // throws java.lang.NullPointerException

2
@Aquillo:Java中有“double”原始数据类型。http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html - nhahtdh
2
检查各自方法的源代码,似乎只是一种不一致。parseDouble 不进行空值检查,当遇到空值时会抛出 NPE,但在 parseInt 中,输入字符串会被检查是否为空。我看不出它们应该表现不同的任何好理由。 - NilsH
我已经检查过它们都抛出了相同的NumberFormatException。 - twlkyao
2个回答

71
可以合理地期望对于null值抛出相同的异常;然而,这些API非常古老,可能无法在此时进行更改。
由于异常行为已经存在很长时间并在JavaDoc中进行了说明,目前改变任何方法的行为是不切实际的。因此,将其标记为不会修复。
正如其他人所说:很可能是由不同的作者编写的。
来源:Bug Report: Integer.parseInt() and Double.parseDouble() throw different exceptions on null.

2
相关且有趣的错误报告:http://bugs.sun.com/view_bug.do?bug_id=6463998 看起来在Java 6中,Double/Float类的parse方法会抛出NPE。 - nhahtdh
2
有趣的是,评论说这个功能“当时就非常老”,而现在已经过去了15年。 - Southpaw Hare
这种不一致性很可能源自Java 1.0。不幸的是,要验证它将会很困难。我认为Java 1.0已经无法下载了,而且你需要一个Windows 95 / NT的计算机来运行它。或者是一台古老的SPARC机器。 - Stephen C

59

注意:本文中的所有内容都是源自Java7-b147

Double.parseDouble() 进入了一个Sun库(在 sun.misc.FloatingDecimal),第一件重要的事情是:

in = in.trim(); // don't fool around with white space.
                // throws NullPointerException if null

Integer.parseInt()Integer类中是手动完成的。首先发生的重要事情是:

if (s == null) {
    throw new NumberFormatException("null");
}

我猜测这篇文章由两位不同的作者所写。

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