2010-07-25 45 views

回答

18

沒有優勢無論如何,你可以做

if(a instanceof A) {} 

這將 回報 評估爲假,如果是null

+5

1 JLS:在運行時,instanceof運算符的結果是,如果真RelationalExpression的值不爲null,並且可以將引用強制轉換爲ReferenceType(§15.16)而不引發ClassCastException。否則結果是錯誤的。 http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#80289 – barrowc 2010-07-25 05:29:32

+0

@barrowc pin指向點! – naikus 2010-07-25 05:40:26

+0

自1997年以來,我一直在編程Java,這對我來說是新聞。謝謝,+1! – 2010-07-25 06:16:13

0

我嚴重懷疑有先檢查空任何好處。這取決於虛擬機如何實現實例檢查......可能性是否將自身作爲代碼的第一部分。

+1

它不符合虛擬機。它的lang規範,「空類型」有一個值:空引用。空引用的類型爲「空類型」,因此上述檢查返回false對於任何其他類型 – naikus 2010-07-25 05:34:57

+0

虛擬機必須實現代碼儘管 - 可能它的第一件事是檢查空 - 所以沒有性能增益放入支票。指定RESULT。它如何達到結果並非如此。 – TofuBeer 2010-07-25 06:11:37

+0

@TofuBeer行爲是*指定的。*它*必須*檢查爲空。它不是以任何方式實施的。 – EJP 2015-08-17 10:25:24

2

if(a instanceof A)就夠了。

if(a!=null && expr)模式用於當expr將拋出NullPointerException如果a爲空。如果a爲空,則a instanceof A不拋出NPE並且僅返回false

4

JVM必須檢查null本身。沒有太多的意義在做兩次。

0

instanceOf操作符不需要顯式空值檢查,因爲如果操作數爲null,它不會拋出空指針異常。

在運行時,如果關係表達式的值不爲空,並且引用可以轉換爲引用類型而不引發類轉換異常,則instanceOf運算符的結果爲true。

如果操作數爲null,則instanceOf運算符返回false,因此不需要顯式空值檢查。

考慮下面的例子,

public static void main(String[] args) { 
             if(a != null && a instanceof ArrayList){                     //Violation 
                  System.out.println("In if block"); 
             } 
             else 
             { 
                  System.out.println("In else block"); 
             } 
         } 

如下圖所示}這種的正確用法,

public static void main(String[] args) { 
           
             if(a instanceof ArrayList){                     //Correct way 
                  System.out.println("In if block"); 
             } 
             else 
             { 
                  System.out.println("In else block"); 
             } 
         } 
相關問題