不,在使用 instanceof 之前不需要进行空检查。
如果x
为null
则表达式x instanceof SomeClass
为false
。
从 Java 语言规范, 第 15.20.2 节 “类型比较运算符 instanceof” :
“在运行时,结果
instanceof
运算符是true
,如果RelationalExpression的值不null
,并引用可以转换为引用类型不提高一个ClassCastException
。否则,结果是false
。”
因此,如果操作数为 null,则结果为 false。
使用 null 引用作为instanceof
的第一个操作数返回false
。
确实很好的问题。我只是为自己尝试过。
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。类型比较运算符 instanceof
在运行时,如果RelationalExpression的值不为
null
,则instanceof
运算符的结果为true
,并且可以在不引发ClassCastException
情况下将引用ClassCastException
转换为ReferenceType 。否则结果是false
。
API / Class#isInstance(Object)
如果此
Class
对象表示接口,则如果指定Object
参数的类或任何超类实现此接口,则此方法返回true
否则返回true
。否则返回false
。如果此Class
对象表示基本类型,则此方法返回false
。
不,在使用 instanceof 之前不需要进行空检查。
如果x
为null
则表达式x instanceof SomeClass
为false
。
从 Java 语言规范, 第 15.20.2 节 “类型比较运算符 instanceof” :
“在运行时,结果
instanceof
运算符是true
,如果RelationalExpression的值不null
,并引用可以转换为引用类型不提高一个ClassCastException
。否则,结果是false
。”
因此,如果操作数为 null,则结果为 false。
使用 null 引用作为instanceof
的第一个操作数返回false
。
确实很好的问题。我只是为自己尝试过。
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。类型比较运算符 instanceof
在运行时,如果RelationalExpression的值不为
null
,则instanceof
运算符的结果为true
,并且可以在不引发ClassCastException
情况下将引用ClassCastException
转换为ReferenceType 。否则结果是false
。
API / Class#isInstance(Object)
如果此
Class
对象表示接口,则如果指定Object
参数的类或任何超类实现此接口,则此方法返回true
否则返回true
。否则返回false
。如果此Class
对象表示基本类型,则此方法返回false
。