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.