在调用instanceof之前需要检查null
请问null instanceof SomeClass返回false或抛出一个NullPointerException ?
不,在使用instanceof之前不需要空的检查。
如果x为null则expression式x instanceof SomeClass为false 。
从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 将返回false或true因此当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"); } }