有人能解释一下这段代码的输出吗?
public class Main
{
int temp()
{
return(true ? null : 0);
}
public static void main(String[] args)
{
Main m=new Main();
System.out.println(m.temp());
}
}
答案 0 :(得分:6)
让我们一个接一个:
首次编译:为什么编译成功?看看下面的代码:
int getIntValue(){
return new Integer(0));//note that i am returning a reference here and hence even I can possibly pass a null.
}
这里发生拆箱,你会看到这段代码正确编译。即使这段代码运行良好。
现在来看你的代码:
int temp()
{
return(true ? null : 0);
}
这里有一些事情,首先是利用三元运算符。 Java规范说如果任何操作数是T类型而其他操作数是原始的,则原语首先被自动装箱,并且作为操作的结果返回类型T.因此,0是第一个包装(autoboxed)到Integer,而返回类型基本上转换为Integer类型(记住,我们可以在这里传递null)。现在,当您将null作为返回类型传递时,在运行时,这将转换为int premitive类型。
所以我们基本上做的如下:
int i =(int)null;
以上代码基本上为您提供了nullpointerexception。
答案 1 :(得分:2)
有人能解释一下这段代码的输出吗?
这将始终通过NullPointerException
。尝试将null
取消设置为int
是NullPointerException
。
return(true ? null : 0);
条件始终为true
,因此返回表达式的计算结果为null
。第二个和第三个操作数分别为null
和0
。由于null
可以是引用的值,因此整个表达式将输入Integer
,因为它与0
和null
最匹配。由于返回类型是原始的int
,因此Integer null
引用应该被取消装箱到int
,而这样做它应该抛出NPE
而int
无法保持null
{1}},但Integer
可以。
参考JLS。
条件表达式的类型确定如下:
如果第二个和第三个操作数之一是原始类型T,而另一个操作数的类型是将装箱转换(第5.1.7节)应用于T的结果,那么条件表达式的类型是吨。
- 醇>
如果第二个和第三个操作数之一是null类型而另一个操作数的类型是引用类型,则条件表达式的类型是该引用类型。
答案 2 :(得分:0)
它应该抛出NullPointerException
因为此语句中的return(true ? null : 0);
将始终返回null;
答案 3 :(得分:0)
将抛出NullPointerException。这是因为三元将评估为包含null的盒装类型,并且当您取消打包包含null的盒装类型(Java必须执行以返回int)时,您将获得该异常。
有关详细信息,请参阅Conversion from null to int possible?
答案 4 :(得分:-2)
它将是NullPointerException
,因为 int不能指定为null
但是,此代码将始终返回null,因为此处您将条件始终声明为true
,因此将返回三元语句的真正部分,即null
但这有效
public class Test
{
Integer temp()
{
return(true ? null : 0);
}
public static void main(String[] args)
{
Test m=new Test();
System.out.println(m.temp());
}
}
因为Integer can hold null value , primitive int cannot.