2012-04-17 18 views
5

Il seguente snippet utilizza un semplice codice Java.Unknown NullPointerException in 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())); 
    } 
} 

Il codice precedente funziona come previsto senza alcun problema e visualizza Value = null sulla console.

Nella return dichiarazione seguente,

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

poiché l'oggetto demo di tipo Demo è nonnull, l'espressione dopo : che è demo.getValue() viene eseguito che invoca getValue() all'interno della interiore Demo classe che restituisce null e infine, viene convertito in String e visualizzato sulla console.

Ma quando modifico il operations() metodo di qualcosa di simile a quello mostrato qui sotto,

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

getta NullPointerException. Come?


intendo quando uso questo return dichiarazione

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

funziona (non gettare NullPointerException)

e quando uso il seguente qualcosa di similereturn dichiarazione

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

causa NullPointerException. Perché?

+3

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

+0

possibile duplicato di [strana NullPointerException Java con autoboxing] (http://stackoverflow.com/questions/ 3265948/strange-java-NullPointerException-con-autoboxing) – Pops

risposta

11

Questa dichiarazione:

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

in realtà viene trasformata in qualcosa di simile:

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

Il tipo dell'espressione condizionale è determinato ad essere int (non Integer) in base alle regole laid out in the JLS, section 15.25 , usando binary numeric promotion (5.6.2). La conversione dal riferimento null a int attiva quindi lo NullPointerException.

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

In questo caso il tipo di espressione è intero e null è un valore legale.

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

In questo caso il tipo di espressione è int, quindi il valore di ritorno intero viene automaticamente annullato. E dato che è nullo, lancia un NPE.

Problemi correlati