2012-04-17 23 views
5

El siguiente fragmento utiliza un código Java simple.Desconocido NullPointerException en Java

package pkg; 

final public class Main 
{ 
    final private class Demo 
    { 
     private Integer value = null; 

     public Integer getValue() 
     { 
      return value; 
     } 
    } 

    private Integer operations() 
    { 
     Demo demo = new Demo(); 
     return demo==null?new Integer(1):demo.getValue(); 
    } 

    public static void main(String[] args) 
    { 
     Main main=new Main(); 
     System.out.println("Value = " + String.valueOf(main.operations())); 
    } 
} 

El código anterior funciona como se esperaba sin problemas y muestra Value = null en la consola.

En el return declaración siguiente,

return demo==null?new Integer(1):demo.getValue(); 

ya que el objeto demo de tipo Demo es nonull, la expresión después de : que es demo.getValue() se ejecuta que invoca getValue() dentro de la clase interna Demo que devuelve null y finalmente, se convierte a String y se muestra en la consola.

Pero cuando modifico el método operations() algo así como el que se muestra a continuación,

private Integer operations() 
{ 
    Demo demo = new Demo();  
    return demo==null?1:demo.getValue(); 
} 

arroja NullPointerException. ¿Cómo?


me refiero cuando uso esta declaración return

return demo==null?new Integer(1):demo.getValue(); 

funciona (no tira NullPointerException)

y cuando utilizo el siguiente algo similarreturn comunicado

return demo==null?1:demo.getValue(); 

causa NullPointerException. ¿Por qué?

+3

http://stackoverflow.com/questions/7811608/java-npe-in-ternary-operator-with-autoboxing –

+0

posible duplicado de [extraño NullPoolException con autoboxing] (http://stackoverflow.com/questions/ 3265948/strange-java-nullpointerexception-con-autoboxing) – Pops

Respuesta

11

Esta afirmación:

return demo==null?1:demo.getValue(); 

realidad se está convirtiendo en algo como esto:

int tmp = demo == null ? 1 : demo.getValue().intValue(); 
return (Integer) tmp; 

se determina el tipo de la expresión condicional para ser int (no Integer) basado en las normas laid out in the JLS, section 15.25 , usando binary numeric promotion (5.6.2). La conversión de la referencia nula a int activa el NullPointerException.

3
return demo==null?new Integer(1):demo.getValue(); 

En este caso, el tipo de expresión es Integer y null es un valor legal.

return demo==null?1:demo.getValue(); 

En este caso, el tipo de la expresión es de tipo int, por lo que su entrega de valor entero es automáticamente sin embalaje. Y como es nulo, arroja un NPE.

Cuestiones relacionadas