2013-05-01 10 views
86

Perché Double.parseDouble (null) e Integer.parseInt (null) generano eccezioni diverse?Perché Double.parseDouble (null) e Integer.parseInt (null) generano eccezioni diverse?

Si tratta di un incidente storico o intenzionale? La documentazione afferma chiaramente due tipi di eccezioni per Double.parseDouble(...) e una per Integer.parseInt(), ma sembra incoerente:

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

Tuttavia

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

@Aquillo: C'è il 'doppio' primitivo http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – nhahtdh

+2

Controllare il codice sorgente dei rispettivi metodi, sembra solo un'incongruenza. 'parseDouble' non esegue un controllo Null e getta solo un NPE quando viene rilevato, ma in' parseInt', quindi la stringa di input viene controllata per 'null'. Non riesco a vedere alcuna buona ragione per cui dovrebbero comportarsi diversamente. – NilsH

+0

Ho verificato che generano lo stesso valore NumberFormatException. – twlkyao

risposta

65

È ragionevole aspettarsi che le stesse eccezioni vengano generate per null; tuttavia, queste API sono molto vecchie e potrebbero non essere modificabili a questo punto.

E:

Dal momento che il comportamento di eccezione è di lunga data e specificato nel JavaDoc, non è pratico di cambiare il comportamento di entrambi i metodi in questo momento. Chiusura come non risolverà.

Come tratto da: Bug Report: Integer.parseInt() and Double.parseDouble() throw different exceptions on null.

Come altri hanno già detto: è probabile fatta da diversi autori.

+1

Segnalazione di bug relativa e interessante: http://bugs.sun.com/view_bug.do?bug_id=6463998 Sembra in Java 6, il metodo di analisi dalla classe Double/Float genera NPE. – nhahtdh

+2

In modo divertente, il commento diceva che questa funzionalità era "molto vecchia" * al momento, * e che era 15 anni fa ora. –

56

Nota: tutto in questo post è la fonte di Java7-B147

Double.parseDouble() va in una libreria Sun (in sun.misc.FloatingDecimal) la prima cosa importante che accade è:

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

Integer.parseInt() viene eseguito manualmente nella classe Integer. La prima cosa importante che succede è:

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

Direi che ci sono due autori diversi.