5

次のスニペットでは、単純な 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型のオブジェクトがDemois ではない nullため、式:が実行され、それが返される内部クラス内demo.getValue()で呼び出され、最後に String に変換されてコンソールに表示されます。getValue()Demonull

しかし、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ます。なんで?

4

2 に答える 2

11

この文:

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

実際には次のようなものに変換されています。

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

条件式の型は、バイナリ数値昇格 (5.6.2)を使用して、JLS のセクション 15.25 に規定されている規則に基づいてint(not ) であると判断されます。null 参照からthen への変換により、.IntegerintNullPointerException

于 2012-04-17T06:34:33.073 に答える
3
return demo==null?new Integer(1):demo.getValue();

この場合、式の型は整数で、null は正当な値です。

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

この場合、式の型は int であるため、整数の戻り値は自動的にボックス化されません。null であるため、NPE をスローします。

于 2012-04-17T06:35:20.103 に答える