SomeClass的null实例是否返回false或引发NullPointerException?


当前回答

使用空引用作为instanceof的第一个操作数将返回false。

其他回答

不,在使用instanceof之前不需要进行null检查。

如果x为空,SomeClass的表达式x instance为false。

Java 11语言规范在第15.20.2节“类型比较运算符instanceof”中简洁地表达了这一点。(在引入了instanceofpatternmatching之后,Java17就不那么简洁地表达了这一点。)

“在运行时如果RelationalExpression的值为不为null,引用可以为强制转换为ReferenceType而不引发ClassCastException。否则,结果为假。"

因此,如果操作数为空,则结果为假。

不,不是。如果第一个操作数为空,instanceof将返回false。

instanceof运算符不需要显式的null检查,因为如果操作数为null,它不会引发NullPointerException。

在运行时,如果关系表达式的值不为null,则instanceof运算符的结果为true,并且可以将引用转换为引用类型,而不会引发类转换异常。

如果操作数为空,instanceof运算符将返回false,因此不需要显式的空检查。

考虑以下示例,

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");
         }  
}

instanceof之前不需要null检查在instanceof验证为true后,不需要进行null检查

以下是空安全的:

if(couldbenull instanceof Comparable comp){
   return comp.compareTo(somethingElse);
}
//java < 14
if(couldbenull instanceof Comparable){
   return ((Comparable)couldbenull).compareTo(somethingElse);
}

这个问题确实很好。我只是试着自己。

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));
    }
}

打印

true
true
false
false

JLS/1520.2。类型比较运算符实例

在运行时,如果RelationalExpression的值不为null,则instanceof运算符的结果为true,并且引用可以在不引发ClassCastException的情况下强制转换为ReferenceType。否则,结果为假。

API/Class#isInstance(对象)

如果此Class对象表示接口,则如果指定object参数的类或任何超类实现了此接口,则此方法返回true;否则返回false。如果此Class对象表示基元类型,则此方法返回false。