86

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

Czy jest to wypadek historyczny czy zamierzony? Dokumentacja wyraźnie stwierdza 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

@Aquillo: Istnieje "podwójne" prymitywne http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – nhahtdh

+2

Sprawdzanie kodu źródłowego poszczególnych metod, wydaje się po prostu niespójnością. 'parseDouble' nie wykonuje sprawdzenia zerowego i po prostu wyrzuca NPE, gdy jest napotkany, ale w' parseInt', wtedy wejściowy ciąg jest sprawdzany dla 'null'. Nie widzę żadnego dobrego powodu, aby zachowywać się inaczej. – NilsH

+0

Sprawdziłem, czy rzucają ten sam wyjątek NumberFormatException. – twlkyao

Odpowiedz

65

Rozsądnie jest oczekiwać, że te same wyjątki będą zgłaszane dla wartości zerowej; jednakże te api są bardzo stare i nie można ich zmienić w tym momencie.

I:

Ponieważ zachowanie Wyjątkiem jest od dawna i określone w JavaDoc jest to niepraktyczne, aby zmienić zachowanie obu metod w tym czasie. Zamknięcie jako nie zostanie naprawione.

pobrane z: Bug Report: Integer.parseInt() and Double.parseDouble() throw different exceptions on null.

Podobnie jak inni stwierdzili: to prawdopodobnie wykonane przez różnych autorów.

+1

Powiązany i interesujący raport o błędzie: http://bugs.sun.com/view_bug.do?bug_id=6463998 Wydaje się, że w Javie 6, metoda parsowania z klasy Double/Float rzuca NPE. – nhahtdh

+2

Zabawnie, w komentarzu napisano, że ta funkcja była "bardzo stara" * w tym czasie, * i to było 15 lat temu. –

56

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

Double.parseDouble() idzie do biblioteki Sun (w sun.misc.FloatingDecimal) pierwsza ważna 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 klasie Integer. Pierwsza ważna rzecz to:

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

Zgaduję, że są dwaj różni autorzy.

Powiązane problemy