在调用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。