当返回值为int时,通过条件运算符返回null

时间:2013-06-21 06:51:35

标签: java ternary-operator autoboxing

有人能解释一下这段代码的输出吗?

public class Main
{
   int temp()
   {
      return(true ? null : 0);  
   }


public static void main(String[] args)
{
    Main m=new Main();
    System.out.println(m.temp());
 }
}

5 个答案:

答案 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取消设置为intNullPointerException

return(true ? null : 0); 

条件始终为true,因此返回表达式的计算结果为null。第二个和第三个操作数分别为null0。由于null可以是引用的值,因此整个表达式将输入Integer,因为它与0null最匹配。由于返回类型是原始的int,因此Integer null引用应该被取消装箱到int,而这样做它应该抛出NPEint无法保持null {1}},但Integer可以。

参考JLS

  

条件表达式的类型确定如下:

     
      
  1. 如果第二个和第三个操作数之一是原始类型T,而另一个操作数的类型是将装箱转换(第5.1.7节)应用于T的结果,那么条件表达式的类型是吨。

  2.   
  3. 如果第二个和第三个操作数之一是null类型而另一个操作数的类型是引用类型,则条件表达式的类型是该引用类型。

  4.   

答案 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.