El código siguiente inicia NullPointerException:

int num = Integer.getInteger("123");

Es mi compilador invocando getInteger en nulo, ya que es la estática? Eso no tiene ningún sentido!

¿Qué está pasando?

InformationsquelleAutor user282886 | 2010-06-26

3 Comentarios

  1. 205

    El Panorama

    Hay dos cuestiones en juego aquí:

    • Integer getInteger(String) no hace lo que piensa
      • Devuelve null en este caso
    • la asignación de Integer a int causas de auto-unboxing
      • Desde el Integer es null, NullPointerException se produce

    Para analizar (String) "123" a (int) 123, puede usarse, por ejemplo,int Integer.parseInt(String).

    Referencias

    Integer API referencias


    En Integer.getInteger

    He aquí lo que la documentación tiene que decir acerca de lo que hace este método:

    public static Integer getInteger(String nm): Determina el valor entero de la propiedad del sistema con el nombre especificado. Si no hay ninguna propiedad con el nombre especificado, si el nombre especificado está vacío o null, o si la propiedad no tiene el correcto formato numérico, entonces null se devuelve.

    En otras palabras, este método no tiene nada que ver con el análisis de un String a un int/Integer valor, sino que más bien tiene que ver con Sistema.getProperty método.

    Es cierto que esto puede ser una sorpresa. Es lamentable que la biblioteca tiene sorpresas como esta, pero enseña una valiosa lección: siempre consultar la documentación para confirmar lo que es un método que no.

    Coincindentally, una variante de este problema apareció en Retorno de la Puzzlers: Porquería y el Temor (TS-5186), Josh Bloch y Neal Gafter de 2009 de la JavaOne Sesión Técnica de presentación. Aquí está la diapositiva final:

    La Moral

    • Extraño y terrible métodos se esconden en las bibliotecas
      • Algunos han inocuo nombres que suenan
    • Si el código se porta mal
      • Asegúrese de que usted está llamando a la derecha métodos
      • Leer la documentación de la biblioteca de
    • Para la API de diseñadores
      • No violar el principio de la menor sorpresa
      • No violen la abstracción de la jerarquía de
      • No usan nombres similares para comportamientos diferentes

    Para su integridad, también hay de estos métodos que son análogos a Integer.getInteger:

    Preguntas relacionadas


    En autounboxing

    La otra cuestión, por supuesto, es cómo la NullPointerException se tira. Centrado en este tema, podemos simplificar el fragmento de código de la siguiente manera:

    Integer someInteger = null;
    int num = someInteger; //throws NullPointerException!!!

    He aquí una cita de Efectivo Java 2ª Edición, Artículo 49: Prefieren los tipos primitivos a la caja de primitivas:

    En resumen, el uso de las primitivas de preferencia en caja primitivo cuando usted tiene la opción. Los tipos primitivos son más simples y rápidos. Si debe utilizar la caja de primitivas, ¡ten cuidado! Autoboxing reduce el nivel de detalle, pero no el peligro, de uso en caja primitivas. Cuando el programa compara dos en caja primitivas con el == operador, no una identidad comparación, que es casi seguro que no lo desea. Cuando su programa no mixto tipo de cálculos que implican en caja y sin caja primitivas, que hace el unboxing, y cuando su programa no unboxing, se puede lanzar NullPointerException. Por último, cuando el programa de cajas de valores primitivos, puede resultar en costosas e innecesarias creaciones de objetos.

    Hay lugares donde usted no tiene ninguna opción pero para uso en caja primitivas, por ejemplo, los genéricos, pero de lo contrario, usted debería considerar seriamente si la decisión de uso en caja primitivas se justifica.

    Preguntas relacionadas

    • Así Integer.getInteger(s) es aproximadamente equivalente a Integer.parseInt(System.getProperty(s))? Creo que prefiero la segunda, aunque es más detallado, porque pone de relieve el hecho de que usted está tirando de la información de las propiedades del sistema.
    • Tan pronto como he publicado ese comentario, me di cuenta de que yo pudiera mirar a la fuente real del Entero de clase! Yo estaba en el camino correcto, excepto que se utiliza Integer.decode en lugar de Integer.parseInt, que busca un líder 0x o 0 para analizar el número hexadecimal u octal, respectivamente.
    • Gracias, esto me ayudó mucho. 🙂
    • Para aquellos que están pidiendo a ¿por Qué NullPointerException?: programmers.stackexchange.com/questions/158908/…
    • se puede desaprobar java.lang.Entero.getInteger(Cadena) por favor?
  2. 6

    Por favor, 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 cualquier propiedad del sistema, como se discutió aquí.
    Si desea convertir esta Cadena int, a continuación, utilizar el método de la
    int num = Integer.parseInt("123").

    • Editada; por favor volver si es incorrecta.
    • es la respuesta correcta.wht u esperado?si u hav ningún problema, a continuación, preguntar

Dejar respuesta

Please enter your comment!
Please enter your name here