Warum lösen Double.parseDouble (null) und Integer.parseInt (null) unterschiedliche Ausnahmen aus?

92

Warum lösen Double.parseDouble (null) und Integer.parseInt (null) unterschiedliche Ausnahmen aus?

Ist das ein historischer Unfall oder beabsichtigt? In der Dokumentation werden eindeutig zwei Arten von Ausnahmen für Double.parseDouble(...)und eine für angegeben Integer.parseInt(), aber es scheint inkonsistent:

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

jedoch

Double.parseDouble(null); // throws java.lang.NullPointerException
pho79
quelle
2
@ Aquillo: Es gibt doubleprimitive docs.oracle.com/javase/tutorial/java/nutsandbolts/…
nhahtdh
2
Das Überprüfen des Quellcodes der jeweiligen Methoden scheint nur eine Inkonsistenz zu sein. parseDoubleführt keine Nullprüfung durch und löst nur eine NPE aus, wenn sie angetroffen wird, aber in parseInt, dann wird die Eingabezeichenfolge überprüft null. Ich kann keinen guten Grund sehen, warum sie sich anders verhalten sollten.
NilsH
Ich habe überprüft, ob sie die gleicheNumberFormatException auslösen.
Twlkyao

Antworten:

67

Es ist vernünftig zu erwarten, dass dieselben Ausnahmen für null ausgelöst werden. Diese APIs sind jedoch sehr alt und können zu diesem Zeitpunkt möglicherweise nicht geändert werden.

Und:

Da das Ausnahmeverhalten seit langem besteht und im JavaDoc angegeben ist, ist es derzeit unpraktisch, das Verhalten einer der beiden Methoden zu ändern. Schließen wie wird nicht behoben.

Wie aus: Bug Report: Integer.parseInt () und Double.parseDouble () werfen unterschiedliche Ausnahmen auf null.

Wie andere gesagt haben: Es wird wahrscheinlich von verschiedenen Autoren gemacht.

Floris Velleman
quelle
2
Zugehöriger und interessanter Fehlerbericht: bugs.sun.com/view_bug.do?bug_id=6463998 Wie in Java 6 scheint die Analysemethode der Double / Float-Klasse NPE auszulösen.
nhahtdh
2
Amüsanterweise sagte der Kommentar, dass diese Funktionalität zu dieser Zeit "sehr alt" war, und das war jetzt vor 15 Jahren.
Southpaw Hare
Diese Inkonsistenz stammt höchstwahrscheinlich aus Java 1.0. Leider wäre es schwierig, dies zu überprüfen. Ich glaube nicht, dass Java 1.0 zum Herunterladen verfügbar ist, und Sie benötigen eine Windows 95 / NT-Box, um es auszuführen. Oder eine alte SPARC-Maschine.)
Stephen C
59

Hinweis: Alles in diesem Beitrag befindet sich in der Quelle von Java7-b147

Double.parseDouble()geht in eine Sun-Bibliothek (in sun.misc.FloatingDecimal) das erste wichtige, was passiert, ist:

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

Integer.parseInt()erfolgt manuell in der IntegerKlasse. Das erste wichtige, was passiert, ist:

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

Ich würde vermuten, dass es zwei verschiedene Autoren gibt.

durron597
quelle