¿Por qué Double.parseDouble (nulo) e Integer.parseInt (nulo) arrojan excepciones diferentes?


92

¿Por qué Double.parseDouble (nulo) e Integer.parseInt (nulo) arrojan excepciones diferentes?

¿Es esto un accidente histórico o intencional? La documentación establece claramente dos tipos de excepciones para Double.parseDouble(...)y una para Integer.parseInt(), pero parece inconsistente:

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

sin embargo

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


2
Al verificar el código fuente de los métodos respectivos, parece solo una inconsistencia. parseDoubleno realiza una verificación nula, y solo lanza una NPE cuando se encuentra, pero en parseInt, luego se verifica la cadena de entrada null. No veo ninguna buena razón por la que deberían comportarse de manera diferente.
NilsH

He comprobado que arrojan la sameNumberFormatException.
twlkyao

Respuestas:


67

Es razonable esperar que las mismas excepciones se arrojen por nulo; sin embargo, estas API son muy antiguas y es posible que no se puedan cambiar en este momento.

Y:

Dado que el comportamiento de excepción es de larga data y está especificado en JavaDoc, no es práctico cambiar el comportamiento de cualquiera de los métodos en este momento. Cerrando como no se arreglará.

Tomado de: Informe de error: Integer.parseInt () y Double.parseDouble () arrojan diferentes excepciones en null.

Como han dicho otros: es probable que esté hecho por diferentes autores.


2
Informe de error relacionado e interesante: bugs.sun.com/view_bug.do?bug_id=6463998 Parece que en Java 6, el método de análisis de la clase Double / Float arroja NPE.
nhahtdh

2
Curiosamente, el comentario decía que esta funcionalidad era "muy antigua" en ese momento, y eso fue hace 15 años.
Southpaw Hare

Esta inconsistencia probablemente se origina en Java 1.0. Desafortunadamente, sería difícil verificarlo. No creo que Java 1.0 esté disponible para descargar, y necesitaría una caja de Windows 95 / NT para ejecutarlo. O una máquina SPARC antigua.)
Stephen C

59

Nota: todo en esta publicación está en la fuente de Java7-b147

Double.parseDouble()entra en una biblioteca de Sun (en sun.misc.FloatingDecimal) lo primero que sucede es:

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

Integer.parseInt()se hace manualmente en la Integerclase. Lo primero que sucede es importante:

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

Supongo que hay dos autores diferentes.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.