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

时间:2013-01-25 09:52:26

标签: 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());
  }
}

2 个答案:

答案 0 :(得分:9)

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);

打印

false
true

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

答案 1 :(得分:1)

parseInt返回int。这使得编译器解包m1.method2()但它为null,因此抛出:

Integer v1 = (m1.method1() == null) ? m1.method2() : (Integer)Integer.parseInt(m1.method1());