任何人都可以解釋此代碼的輸出嗎?當返回值爲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());
}
}
任何人都可以解釋此代碼的輸出嗎?當返回值爲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());
}
}
這將是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.
,則必須拋出NullPointerException
,因爲在此聲明,它會永遠返回null return(true ? null : 0);
;
任何人都可以解釋此代碼的輸出?
這將始終通過NullPointerException
。試圖取消箱null
至int
是NullPointerException
。
return(true ? null : 0);
的條件始終true
並且因此返回表達式求null
。第二個和第三個操作數分別是null
和0
。由於null
可以是參考值,因此整個表達式將輸入爲Integer
,因爲它與0
和null
最接近。由於返回類型是基本類型int
,因此Integer null
應參考拆箱到int
,而這樣做,它應該拋出NPE
爲int
不能抱null
,但Integer
即可。
請參閱JLS。
類型的條件表達式的確定如下:
如果第二和第三個操作數中的一個是原始類型T的,並且其他的類型是施加拳擊的結果轉換(§5.1.7)爲T,那麼條件表達式的類型爲T.
如果第二個和第三個操作數中的一個是空類型,而另一個的類型是引用類型,則條件表達式的類型是該引用類型。
一個NullPointerException異常將被拋出。這是因爲三元將評估爲包含null的盒裝類型,並且當您對包含null的盒裝類型(Java必須執行以返回int)進行取消裝箱時,您會得到該異常。
欲瞭解更多詳情,請參閱Conversion from null to int possible?
讓我們這一個接一個:
第一編譯:爲什麼它成功編譯?看看下面的代碼:
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。
+1,那是正確的,原始int不能保持null但Integer類可以,這就是爲什麼它會拋出NPE – anshulkatta
什麼是輸出? –
[你有什麼嘗試](http://mattgemmell.com/2008/12/08/what-have-you-tried/)除了問我們嗎?你有沒有試圖去調試它? –
@Praveen如果你的問題也圍繞它爲什麼它在運行時編譯和失敗,請檢查我的意見低於 – zerocool