El siguiente código arroja NullPointerException
:
int num = Integer.getInteger("123");
¿Mi compilador invoca getInteger
en 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 hacenull
en este casoInteger
aint
causa el desempaquetado automáticoInteger
es decirnull
,NullPointerException
se tiraPara analizar
(String) "123"
a(int) 123
, se puede utilizar, por ejemploint Integer.parseInt(String)
.Referencias
Integer
Referencias APIstatic int parseInt(String)
static Integer getInteger(String)
En
Integer.getInteger
Esto 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
String
unint/Integer
valor, sino que tiene que ver con elSystem.getProperty
mé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
NullPointerException
se 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.decode
lugar deInteger.parseInt
, que busca un encabezado0x
o0
para 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
String
pará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