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