关于java:在调用instanceof之前需要进行null检查吗?

Is null check needed before calling instanceof?

null instanceof SomeClass是返回false还是抛出NullPointerException呢?


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

如果xnull的话,x instanceof SomeClass的表达就是false

从Java语言规范,第1520.2节,"类型比较运算符实例":

"At run time, the result of the
instanceof operator is true if the
value of the RelationalExpression is
not null and the reference could be
cast to the ReferenceType
without raising a ClassCastException.
Otherwise the result is false."

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


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


这个问题真的很好。我只是为自己而努力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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));
    }
}

印刷品

1
2
3
4
true
true
false
false

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

At run time, the result of the instanceof operator is true if the value of the RelationalExpression is not null and the reference could be cast to the ReferenceType without raising a ClassCastException. Otherwise the result is false.

API/类IsInstance(对象)

If this Class object represents an interface, this method returns true if the class or any superclass of the specified Object argument implements this interface; it returns false otherwise. If this Class object represents a primitive type, this method returns false.


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


就像小道消息:

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

(如果排版null看起来很奇怪,有时你必须这样做,例如在这样的情况下:

1
2
3
4
5
6
7
8
9
10
11
12
13
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

附言:如果你在招聘,请不要把这当作一个面试问题。D


不,Java文本EDCOX1(4)不是任何类的实例。因此,它不能是任何类的实例。instanceof将返回falsetrue,因此当referenceVariable值为空时, instanceof 返回false


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

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

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

考虑下面的例子,

1
2
3
4
5
6
7
8
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的正确用法如下:

1
2
3
4
5
6
7
8
9
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");
         }  
}