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被选中,它也会被拆箱,然后重新装箱成整数。由于值为空,因此失败。

这是一个类似的示例,可能会有所帮助(或更令人困惑)

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

第一个结果为假的原因是,表达式的类型为int(最后一个参数),这意味着i已拆箱为 anint并重新装箱,因此可以将其分配给整数。这会导致不同的对象(有命令行参数会增加缓存大小并更改它)在第二个示例中,类型是这样的Integer,因此它没有被取消装箱并且对象是相同的。

于 2013-01-25T09:59:47.420 回答
1

parseInt 返回整数。这使得编译器取消装箱 m1.method2() 但它是 null 所以它抛出:

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