在调用instanceof之前需要进行空检查吗?

时间:2010-06-01 13:53:15

标签: java nullpointerexception null

null instanceof SomeClass会返回false还是抛出NullPointerException

8 个答案:

答案 0 :(得分:1634)

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

如果x instanceof SomeClassfalse,则x表达式为null

来自Java语言规范,section 15.20.2, "Type comparison operator instanceof"

  

“在运行时,结果   instanceof运算符为true    RelationalExpression 的值是   不是null ,参考可以是   强制转换为 ReferenceType   没有提出ClassCastException。   否则结果为false。“

因此,如果操作数为null,则结果为false。

答案 1 :(得分:255)

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

答案 2 :(得分:66)

确实非常好的问题。我只是为自己尝试过。

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 / 15.20.2. Type Comparison Operator instanceof

  

在运行时,如果 RelationalExpression 的值不是instanceof并且引用可以转换为true,则null运算符的结果为ClassCastException ReferenceType 而不会引发false。否则结果为Class

<强> API / Class#isInstance(Object)

  

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

答案 3 :(得分:24)

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

答案 4 :(得分:6)

即可。 Java文字null不是任何类的实例。因此,它不能是 instanceof 任何类。 instanceof 会返回falsetrue ,因此当<referenceVariable> instanceof <SomeClass>值为空时,false会返回referenceVariable。< / p>

答案 5 :(得分:6)

就像花絮

即使( ((A)null) instanceof A)也会返回false

(如果类型转换null似乎令人惊讶,有时您必须这样做,例如在以下情况下:

public class Test
{
  public static void test(A a)
  {
    System.out.println("a instanceof A: " + (a instanceof A));
  }

  public static void test(B b) {
    // Overloaded version. Would cause reference ambiguity (compile error)
    // if Test.test(null) was called without casting.
    // So you need to call Test.test((A)null) or Test.test((B)null).
  }
}

因此Test.test((A)null)将打印a instanceof A: false。)

P.S。:如果您正在招聘,请不要将此作为面试问题使用。 :d

答案 6 :(得分:2)

instanceof运算符不需要显式null检查,因为如果操作数为NullPointerException,则不会抛出null

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

如果操作数为null,则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");
         }  
}

答案 7 :(得分:0)

  • 不需要空检查在instanceof之前
  • 不需要空检查instanceof验证为真后

以下内容是空安全的:

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