在调用instanceof之前需要检查null

请问null instanceof SomeClass返回false或抛出一个NullPointerException

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

如果xnull则expression式x instanceof SomeClassfalse

从Java语言规范,位于http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.20.2

“在运行时,如果RelationalExpression的值不为null,并且可以将引用强制转换为ReferenceType(而不引发ClassCastException),则instanceof运算符的结果为true,否则结果为false。

所以如果操作数为null,结果是false。

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

(需要1分钟的时间来尝试)

确实很好的问题。 我只是为自己而努力。

 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。 types比较运算符instanceof

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

API /类#isInstance(Object)

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

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

Java字面值null不是任何类的实例。 因此它不能成为任何阶级的一个实例instanceof 将返回falsetrue因此当referenceVariable值为null时, <referenceVariable> instanceof <SomeClass>将返回false

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

在运行时,如果关系expression式的值不为null ,并且引用可以转换为引用types而不引发类转换exception,则instanceof运算符的结果为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");        } }