2012-04-17 3 views
5

Следующий фрагмент использует простой Java-код.Неизвестный NullPointerException в 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())); 
    } 
} 

Приведенный выше код работает нормально, без проблем, и отображает Value = null на консоли.

В следующем return заявлении

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

, так как объект demo типа Demo является неnull, выражение после того, как : который demo.getValue() выполняется, который вызывает getValue() в пределах внутреннего Demo класса, который возвращает null и, наконец, он преобразуется в String и отображается на консоли.

Но когда я изменить operations() метод что-то, как показано ниже,

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

он бросает NullPointerException. Как?


Я имею в виду, когда я использую этот return заявление

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

он работает (не бросает NullPointerException)

и когда я использую следующий нечто подобноеreturn заявление

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

вызывает NullPointerException. Зачем?

+3

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

+0

Возможный дубликат [странное Java NullPointerException с autoboxing] (http://stackoverflow.com/questions/ 3265948/странно ява-NullPointerException-с-Autoboxing) – Pops

ответ

11

Это заявление:

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

фактически превращаются в нечто вроде этого:

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

Тип условного выражения определяется как int (не Integer) на основе правил laid out in the JLS, section 15.25 , используя binary numeric promotion (5.6.2). Преобразование из нулевой ссылки в int затем вызывает NullPointerException.

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

В этом случае тип выражения является Integer, а null является юридическим значением.

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

В этом случае тип выражения является int, поэтому ваше возвращаемое значение Integer автоматически распаковывается. И поскольку он равен нулю, он бросает NPE.

Смежные вопросы