Dlaczego Double.parseDouble (null) i Integer.parseInt (null) zgłaszają różne wyjątki?

92

Dlaczego Double.parseDouble (null) i Integer.parseInt (null) zgłaszają różne wyjątki?

Czy to przypadek historyczny czy celowy? Dokumentacja jasno określa dwa rodzaje wyjątków dla Double.parseDouble(...)i jeden dla Integer.parseInt(), ale wydaje się niespójna:

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

jednak

Double.parseDouble(null); // throws java.lang.NullPointerException
pho79
źródło
2
@Aquillo: Jest doubleprymitywny docs.oracle.com/javase/tutorial/java/nutsandbolts/ ...
nhahtdh
2
Sprawdzanie kodu źródłowego odpowiednich metod wydaje się po prostu niespójnością. parseDoublenie sprawdza wartości null i po prostu zgłasza NPE, gdy zostanie napotkany, ale w parseInt, a następnie sprawdzany jest ciąg wejściowy null. Nie widzę żadnego powodu, dla którego mieliby zachowywać się inaczej.
NilsH
Sprawdziłem, czy rzucają ten samNumberFormatException.
twlkyao

Odpowiedzi:

67

Rozsądnie jest oczekiwać, że te same wyjątki będą zgłaszane dla wartości zerowej; Jednak te interfejsy API są bardzo stare i na tym etapie mogą nie być w stanie ich zmienić.

I:

Ponieważ zachowanie wyjątku jest długotrwałe i określone w JavaDoc, zmiana zachowania którejkolwiek z metod jest obecnie niepraktyczna. Zamknięcie jako nie naprawi.

Jak wzięto z: Bug Report: Integer.parseInt () i Double.parseDouble () rzucają różne wyjątki na null.

Jak stwierdzili inni: Prawdopodobnie został wykonany przez różnych autorów.

Floris Velleman
źródło
2
Powiązany i interesujący raport o błędzie: bugs.sun.com/view_bug.do?bug_id=6463998 Wygląda na to, że w Javie 6 metoda parsowania z klasy Double / Float generuje NPE.
nhahtdh
2
Co zabawne, w komentarzu powiedziano, że ta funkcja była wówczas „bardzo stara” , a było to 15 lat temu.
Southpaw Hare
Ta niespójność najprawdopodobniej pochodzi z języka Java 1.0. Niestety trudno byłoby to zweryfikować. Nie sądzę, aby Java 1.0 była dostępna do pobrania, a do jej uruchomienia potrzebna byłaby skrzynka z systemem Windows 95 / NT. Lub starożytna maszyna SPARC.)
Stephen C
59

Uwaga: wszystko w tym poście jest w źródle Java7-b147

Double.parseDouble()trafia do biblioteki Sun (w sun.misc.FloatingDecimal) pierwszą ważną rzeczą, która się dzieje, jest:

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

Integer.parseInt()odbywa się ręcznie w Integerklasie. Pierwsza ważna rzecz to:

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

Myślę, że jest dwóch różnych autorów.

durron597
źródło