簡體   English   中英

當返回值為int時,通過條件運算符返回null

[英]returning null through conditional operator when return value is int

誰能解釋這段代碼的輸出?

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


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

讓我們一一介紹:

第一次編譯:為什么編譯成功? 看看下面的代碼:

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是第一個包裝器(自動裝箱)到Integer,然后返回類型基本上轉換為Integer類型(請記住,我們可以在此處傳遞null)。 現在,當您傳遞null作為返回類型時,在運行時將其轉換為int泛型類型。

因此,我們基本上要做的如下:

int i =(int)null; 

上面的代碼基本上為您提供了nullpointerexception。

誰能解釋這段代碼的輸出?

這將始終通過NullPointerException 嘗試將null取消包裝為intNullPointerException

return(true ? null : 0); 

條件始終為true ,因此返回表達式的值為null 第二和第三操作數分別為null0 由於null可以是引用的值,因此整個表達式將被鍵入Integer因為它與0null最接近。 由於返回類型是原始int ,因此應該將Integer null引用取消裝箱到int ,同時這樣做應該拋出NPE因為int不能容納null ,而Integer可以。

請參閱JLS

條件表達式的類型確定如下:

  1. 如果第二個操作數和第三個操作數之一是原始類型T,而另一個操作數的類型是對T應用裝箱轉換(第5.1.7節)的結果,則條件表達式的類型為T。

  2. 如果第二個操作數和第三個操作數之一為空類型,而另一個操作數的類型為引用類型,則條件表達式的類型為該引用類型。

它應該拋出NullPointerException

因為return(true ? null : 0); 在此語句中,它將始終返回null;

將拋出NullPointerException。 這是因為三元數將求值為包含null的裝箱類型,並且當您對包含null的裝箱類型開箱(Java必須這樣做以返回int)時,您會得到該異常。

有關更多詳細信息,請參見可能從null轉換為int嗎?

這將是NullPointerException ,因為不能將int分配為null

但是,此代碼將始終返回null,因為在這里您將條件始終聲明為true ,因此將返回三元語句的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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM