El siguiente código arroja NullPointerException:
int num = Integer.getInteger("123");
¿Mi compilador invoca getIntegeren null ya que es estático? ¡Eso no tiene ningún sentido!
¿Qué esta pasando?
java
integer
nullpointerexception
api-design
autoboxing
user282886
fuente
fuente

Respuestas:
El panorama
Hay dos cuestiones en juego aquí:
Integer getInteger(String)no hace lo que crees que hacenullen este casoIntegeraintcausa el desempaquetado automáticoIntegeres decirnull,NullPointerExceptionse tiraPara analizar
(String) "123"a(int) 123, se puede utilizar, por ejemploint Integer.parseInt(String).Referencias
IntegerReferencias APIstatic int parseInt(String)static Integer getInteger(String)En
Integer.getIntegerEsto es lo que dice la documentación sobre lo que hace este método:
En otras palabras, este método no tiene nada que ver con analizar
Stringunint/Integervalor, sino que tiene que ver con elSystem.getPropertymétodo.Es cierto que esto puede ser una gran sorpresa. Es lamentable que la biblioteca tenga sorpresas como esta, pero le enseña una lección valiosa: siempre busque la documentación para confirmar lo que hace un método.
Casualmente, se presentó una variación de este problema en Return of the Puzzlers: Schlock and Awe (TS-5186) , la presentación de la sesión técnica JavaOne 2009 de Josh Bloch y Neal Gafter. Aquí está la diapositiva final:
Para completar, también existen estos métodos que son análogos a
Integer.getInteger:Boolean.getBoolean(String)Long.getLong(String)Preguntas relacionadas
En autounboxing
El otro problema, por supuesto, es cómo
NullPointerExceptionse lanza. Para centrarnos en este problema, podemos simplificar el fragmento de la siguiente manera:Aquí hay una cita de Effective Java 2nd Edition, Item 49: Prefiere los tipos primitivos a los primitivos en caja:
Hay lugares en los que no tiene más remedio que utilizar primitivas en caja, por ejemplo, genéricos, pero de lo contrario debería considerar seriamente si la decisión de utilizar primitivas en caja está justificada.
Preguntas relacionadas
fuente
Integer.getInteger(s)es aproximadamente equivalente aInteger.parseInt(System.getProperty(s))? Creo que prefiero el segundo, aunque es más detallado, porque destaca el hecho de que está extrayendo información de las propiedades del sistema.Integer.decodelugar deInteger.parseInt, que busca un encabezado0xo0para analizar el número como hexadecimal u octal, respectivamente.NullPointerException? : programmers.stackexchange.com/questions/158908/…De http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
Tu quieres esto:
fuente
Consulte la documentación del método getInteger () . En este método, el
Stringparámetro es una propiedad del sistema que determina el valor entero de la propiedad del sistema con el nombre especificado. "123" no es el nombre de ninguna propiedad del sistema, como se explica aquí . Si desea convertir esta cadena enint, utilice el método comoint num = Integer.parseInt("123").fuente