4

以下のコードの何が問題になっていますか? 実行時に NullPointerException がスローされます。

public class Test
{
  public String method1()
  {
    return null;
  }
  public Integer method2()
  {
    return null;
  }
  public static void main(String args[])throws Exception
  {
    Test m1 = new Test();
    Integer v1 = (m1.method1() == null) ? m1.method2() : Integer.parseInt(m1.method1());
  }
}
4

2 に答える 2

9

aa ? b : cの型は最後の値の型ですc。この場合、それはint. これは、bが選択されていても、ボックス化が解除され、整数に再ボックス化されることを意味します。値が null であるため、これは失敗します。

これは、役立つ(またはより混乱する)同様の例です。

Integer i = 1000;

// same as Integer j = Integer.valueOf(i == 1000 ? i.intValue() : 1000);
Integer j = i == 1000 ? i : 1000;
System.out.println(i == j);

Integer k = i == 1000 ? i : (Integer) 1000;
System.out.println(i == k);

版画

false
true

最初の結果が false である理由は、式の型がint(最後の引数) であるためです。これは、ボックス化されていないことを意味iint、整数に割り当てることができるように再ボックス化されていることを意味します。これにより、別のオブジェクトが生成されます (キャッシュ サイズを増やしてこれを変更するコマンド ライン引数があります) Integer

于 2013-01-25T09:59:47.420 に答える
1

parseIntはintを返します。これにより、コンパイラはm1.method2()のボックスを解除しますが、nullであるため、次のようにスローされます。

Integer v1 = (m1.method1() == null) ? m1.method2() : (Integer)Integer.parseInt(m1.method1());
于 2013-01-25T09:59:15.583 に答える