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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.