2013-06-21 49 views
2

任何人都可以解釋此代碼的輸出嗎?當返回值爲int時通過條件運算符返回null

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

什麼是輸出? –

+1

[你有什麼嘗試](http://mattgemmell.com/2008/12/08/what-have-you-tried/)除了問我們嗎?你有沒有試圖去調試它? –

+0

@Praveen如果你的問題也圍繞它爲什麼它在運行時編譯和失敗,請檢查我的意見低於 – zerocool

回答

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

0

,則必須拋出NullPointerException

,因爲在此聲明,它會永遠返回null return(true ? null : 0);;

2

任何人都可以解釋此代碼的輸出?

這將始終通過NullPointerException。試圖取消箱nullintNullPointerException

return(true ? null : 0); 

的條件始終true並且因此返回表達式求null。第二個和第三個操作數分別是null0。由於null可以是參考值,因此整個表達式將輸入爲Integer,因爲它與0null最接近。由於返回類型是基本類型int,因此Integer null應參考拆箱到int,而這樣做,它應該拋出NPEint不能抱null,但Integer即可。

請參閱JLS

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

  1. 如果第二和第三個操作數中的一個是原始類型T的,並且其他的類型是施加拳擊的結果轉換(§5.1.7)爲T,那麼條件表達式的類型爲T.

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

0

一個NullPointerException異常將被拋出。這是因爲三元將評估爲包含null的盒裝類型,並且當您對包含null的盒裝類型(Java必須執行以返回int)進行取消裝箱時,您會得到該異常。

欲瞭解更多詳情,請參閱Conversion from null to int possible?

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是第一個包裝(自動裝箱)到整數和返回類型基本上轉換爲整數類型(記住,我們可以在這裏傳遞null)。現在,當您將null作爲返回類型傳遞時,在運行時會將其轉換爲int類型。

所以,我們基本上做的是如下:

int i =(int)null; 

而上面的代碼基本上是給你的NullPointerException。

+0

+1,那是正確的,原始int不能保持null但Integer類可以,這就是爲什麼它會拋出NPE – anshulkatta