我的代码出了什么问题?空指针异常

spr*_*ran 4 java nullpointerexception

以下代码有什么问题?它会在执行时抛出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());
  }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 9

a a ? 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);
Run Code Online (Sandbox Code Playgroud)

版画

false
true
Run Code Online (Sandbox Code Playgroud)

第一个结果为false的原因是表达式具有int(最后一个参数)的类型,这意味着i将其取消装箱int并重新装箱,以便将其分配给整数.这导致一个不同的对象(有命令行args会增加缓存大小并改变它)在第二个例子中,类型是Integer这样的,它没有取消装箱,而且对象是相同的.