在調用instanceof以前是否須要進行null檢查?

null instanceof SomeClass返回false仍是拋出NullPointerExceptionhtml


#1樓

確實,這是一個很好的問題。 我只是爲本身而努力。 java

public class IsInstanceOfTest {

    public static void main(final String[] args) {

        String s;

        s = "";

        System.out.println((s instanceof String));
        System.out.println(String.class.isInstance(s));

        s = null;

        System.out.println((s instanceof String));
        System.out.println(String.class.isInstance(s));
    }
}

版畫 api

true
true
false
false

JLS / 15.2.2。 類型比較運算符instanceof oracle

在運行時,若是RelationalExpression的值不爲null而且能夠將引用強制轉換爲ReferenceType而不引起ClassCastException ,則instanceof運算符的結果爲true 。 不然結果爲falseide

API / Class#isInstance(Object) spa

若是此Class對象表示一個接口,則若是指定Object參數的類或任何超類實現此接口,則此方法返回true不然,此方法返回true 。 不然返回false 。 若是此Class對象表示原始類型,則此方法返回falsecode


#2樓

instanceof運算符不須要顯式的null檢查,由於若是操做數爲null ,則它不會引起NullPointerExceptionhtm

在運行時,若是關係表達式的值不爲null ,而且引用能夠強制轉換爲引用類型而不會引起類強制轉換異常,則instanceof運算符的結果爲true。 對象

若是操做數爲null ,則instanceof運算符將返回false ,所以不須要顯式的null檢查。 接口

考慮下面的示例,

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

正確使用instanceof以下所示,

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

#3樓

使用null引用做爲instanceof的第一個操做數將返回false


#4樓

不,這不對。 若是instanceof的第一個操做數爲null則將返回false


#5樓

不,使用instanceof以前不須要進行空檢查。

若是xnull則表達式x instanceof SomeClassfalse

根據Java語言規範的第15.20.2節「類型比較運算符instanceof」

「在運行時,結果instanceof運算符是true ,若是RelationalExpression的值null ,並引用能夠轉換爲引用類型不提升一個ClassCastException 。不然,結果是false 。」

所以,若是操做數爲null,則結果爲false。

相關文章
相關標籤/搜索