2012-04-17 36 views
5

Poniższy fragment wykorzystuje prosty kod Java.Nieznany wyjątek NullPointerException w Javie

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())); 
    } 
} 

Powyższy kod działa zgodnie z oczekiwaniami bez problemu i wyświetla Value = null na konsoli.

W poniższej return oświadczeniu

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

od obiektu demo typu Demo jest nienull wyrażenie po : który jest demo.getValue() jest wykonywany który wywołuje getValue() w wewnętrznym Demo klasy, która zwraca null i na koniec jest konwertowany na String i wyświetlany na konsoli.

Ale kiedy modyfikować operations() metoda coś podobnego do przedstawionego poniżej,

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

rzuca NullPointerException. W jaki sposób?


Znaczy kiedy używam tego return oświadczenie

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

to działa (nie rzucać NullPointerException)

i kiedy użyć następującego coś podobnegoreturn oświadczenie

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

to powoduje NullPointerException. Czemu?

+3

http://stackoverflow.com/questions/7811608/java-npe-internated-operator-z-autoboxing –

+0

możliwy duplikat [dziwnego Java NullPointerException z autoboxingiem] (http://stackoverflow.com/questions/ 3265948/strange-java-nullpointerexception-with-autoboxing) – Pops

Odpowiedz

11

To stwierdzenie:

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

jest faktycznie przekształcona w coś takiego:

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

typu wyrażenia warunkowego jest zdeterminowana, aby być int (nie Integer) na podstawie przepisów laid out in the JLS, section 15.25 , używając binary numeric promotion (5.6.2). Konwersja z odwołania zerowego na int następnie wyzwala NullPointerException.

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

W tym przypadku typ wyrażenia to Integer, a wartość null to wartość prawna.

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

W tym przypadku typ wyrażenia to int, więc wartość zwracana przez liczbę całkowitą jest automatycznie rozpakowywana. A ponieważ jest zerowy, rzuca NPE.

Powiązane problemy