86

Warum werfen Double.parseDouble (null) und Integer.parseInt (null) verschiedene Ausnahmen?Warum werfen Double.parseDouble (null) und Integer.parseInt (null) verschiedene Ausnahmen?

Ist dies ein historischer Unfall oder vorsätzlich? In der Dokumentation wird deutlich zwei Arten von Ausnahmen für Double.parseDouble(...) und eine für Integer.parseInt(), aber es scheint widersprüchlich:

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

jedoch

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

@Aquillo: Es gibt 'doppelte' primitive http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – nhahtdh

+2

Überprüfen Sie den Quellcode der jeweiligen Methoden, es scheint nur eine Inkonsistenz. 'parseDouble' führt keine Nullprüfung durch und wirft nur eine NPE, wenn sie gefunden wird, aber in 'parseInt' wird die Eingabezeichenfolge auf' null' überprüft. Ich kann keinen guten Grund sehen, warum sie sich anders verhalten sollten. – NilsH

+0

Ich habe überprüft, dass sie die sameNumberFormatException auslösen. – twlkyao

Antwort

65

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

Und:

Da die Ausnahme Verhalten ist seit langem bestehenden und in der JavaDoc angegeben ist, ist es nicht praktikabel, entweder Methode, das Verhalten zu diesem Zeitpunkt zu ändern. Schließen als wird nicht behoben.

Wie aus genommen: Bug Report: Integer.parseInt() and Double.parseDouble() throw different exceptions on null.

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

+1

Ähnliche und interessante Bug-Bericht: http://bugs.sun.com/view_bug.do?bug_id=6463998 Scheint wie in Java 6 wirft Parse-Methode von Double/Float-Klasse NPE. – nhahtdh

+2

Komischerweise sagte der Kommentar, dass diese Funktionalität zu dieser Zeit "sehr alt" war * und das war vor 15 Jahren. –

56

Hinweis: alles in diesem Beitrag ist in der Quelle der Java7-B147

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

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

Integer.parseInt() wird manuell in der Integer Klasse getan. Die erste wichtige Sache, die passiert ist:

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

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

Verwandte Themen