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


92

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

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

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

però

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

2
@Aquillo: There is doubleprimitive docs.oracle.com/javase/tutorial/java/nutsandbolts/…
nhahtdh

2
Controllando il codice sorgente dei rispettivi metodi, sembra solo un'incongruenza. parseDoublenon esegue un controllo nullo e genera solo un NPE quando viene rilevato, ma in parseInt, viene verificata la stringa di input null. Non vedo nessuna buona ragione per cui dovrebbero comportarsi in modo diverso.
NilsH

Ho verificato che generino la stessa eccezioneNumberFormatException.
twlkyao

Risposte:


67

È ragionevole aspettarsi che le stesse eccezioni vengano lanciate per null; tuttavia, queste API sono molto vecchie e potrebbe non essere possibile modificarle a questo punto.

E:

Poiché il comportamento dell'eccezione è di lunga data e specificato in JavaDoc, non è pratico modificare il comportamento di entrambi i metodi in questo momento. La chiusura come non risolverà.

Come tratto da: Bug Report: Integer.parseInt () e Double.parseDouble () generano diverse eccezioni su null.

Come altri hanno affermato: è probabile che sia realizzato da autori diversi.


2
Segnalazione di bug correlata e interessante: bugs.sun.com/view_bug.do?bug_id=6463998 Sembra come in Java 6, il metodo di analisi della classe Double / Float genera NPE.
nhahtdh

2
In modo divertente, il commento diceva che questa funzionalità era "molto vecchia" all'epoca, e questo accadeva 15 anni fa.
Southpaw Hare

Questa incoerenza molto probabilmente ha origine in Java 1.0. Sfortunatamente, sarebbe difficile verificarlo. Non credo che Java 1.0 sia disponibile per il download e per eseguirlo avresti bisogno di un box Windows 95 / NT. O un'antica macchina SPARC.)
Stephen C

59

Nota: tutto in questo post è nel sorgente di Java7-b147

Double.parseDouble()entra 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 in Integerclasse. La prima cosa importante che accade è:

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

Immagino che ci siano due autori diversi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.