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