[英]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
取消包裝為int
是NullPointerException
。
return(true ? null : 0);
條件始終為true
,因此返回表達式的值為null
。 第二和第三操作數分別為null
和0
。 由於null
可以是引用的值,因此整個表達式將被鍵入Integer
因為它與0
和null
最接近。 由於返回類型是原始int
,因此應該將Integer null
引用取消裝箱到int
,同時這樣做應該拋出NPE
因為int
不能容納null
,而Integer
可以。
請參閱JLS 。
條件表達式的類型確定如下:
如果第二個操作數和第三個操作數之一是原始類型T,而另一個操作數的類型是對T應用裝箱轉換(第5.1.7節)的結果,則條件表達式的類型為T。
如果第二個操作數和第三個操作數之一為空類型,而另一個操作數的類型為引用類型,則條件表達式的類型為該引用類型。
它應該拋出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.