Double.parseDouble(null)とInteger.parseInt(null)が異なる例外をスローするのはなぜですか?


92

Double.parseDouble(null)とInteger.parseInt(null)が異なる例外をスローするのはなぜですか?

これは歴史的な事故ですか、それとも意図的な事故ですか?ドキュメントは明確のために、例外の2種類を述べてDouble.parseDouble(...)とのための1つをInteger.parseInt()、それは矛盾しているようです。

Integer.parseInt(null); // throws java.lang.NumberFormatException: null

しかしながら

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

2
@Aquillo:ありdoubleプリミティブdocs.oracle.com/javase/tutorial/java/nutsandbolts/...
nhahtdh

2
それぞれのメソッドのソースコードをチェックすると、ただの矛盾のようです。parseDoublenullチェックを行わず、NPEが検出されたときにNPEをスローするだけですが、parseIntでは、入力文字列がについてチェックされnullます。彼らが違った振る舞いをするべきであるという正当な理由は見当たらない。
NilsH 2013年

sameNumberFormatExceptionがスローされることを確認しました。
twlkyao 2016

回答:


67

同じ例外がnullに対してスローされることを期待するのは妥当です。ただし、これらのAPIは非常に古く、現時点では変更できない場合があります。

そして:

例外の動作は長く続いており、JavaDocで指定されているため、現時点でいずれかのメソッドの動作を変更することは現実的ではありません。修正しないので終了します。

:から取られたようバグレポート:Integer.parseInt()およびDouble.parseDouble()はnullで別の例外をスローします。

他の人が述べたように:それはおそらく別の作者によって行われました。


2
関連する興味深いバグレポート:bugs.sun.com/view_bug.do?bug_id=6463998 Java 6のように、Double / FloatクラスのparseメソッドがNPEをスローします。
nhahtdh 2013年

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");
}

私は2人の異なる作家がいると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.