null instanceof SomeClass
会返回false
还是抛出NullPointerException
?
答案 0 :(得分:1634)
不,在使用instanceof之前不需要进行空检查。
如果x instanceof SomeClass
为false
,则x
表达式为null
。
来自Java语言规范,section 15.20.2, "Type comparison operator instanceof":
“在运行时,结果
instanceof
运算符为true
RelationalExpression 的值是 不是null
,参考可以是 强制转换为 ReferenceType 没有提出ClassCastException
。 否则结果为false
。“
因此,如果操作数为null,则结果为false。
答案 1 :(得分:255)
使用空引用作为instanceof
的第一个操作数返回false
。
答案 2 :(得分:66)
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. Type Comparison Operator instanceof 强>
在运行时,如果 RelationalExpression 的值不是
instanceof
并且引用可以转换为true
,则null
运算符的结果为ClassCastException
ReferenceType 而不会引发false
。否则结果为Class
。
<强> API / Class#isInstance(Object) 强>
如果此
true
对象表示接口,则如果指定的Object
参数的类或任何超类实现此接口,则此方法返回false
;否则返回Class
。如果此false
对象表示基本类型,则此方法返回{{1}}。
答案 3 :(得分:24)
不,不是。如果第一个操作数为instanceof
,则false
将返回null
。
答案 4 :(得分:6)
否即可。 Java文字null
不是任何类的实例。因此,它不能是 instanceof 任何类。 instanceof
会返回false
或true
,因此当<referenceVariable> instanceof <SomeClass>
值为空时,false
会返回referenceVariable
。< / p>
答案 5 :(得分:6)
就像花絮:
即使(
((A)null)
instanceof A)
也会返回false
。
(如果类型转换null
似乎令人惊讶,有时您必须这样做,例如在以下情况下:
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
。)
P.S。:如果您正在招聘,请不要将此作为面试问题使用。 :d
答案 6 :(得分:2)
instanceof
运算符不需要显式null
检查,因为如果操作数为NullPointerException
,则不会抛出null
。
在运行时,如果关系表达式的值不是instanceof
,则null
运算符的结果为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");
}
}
答案 7 :(得分:0)
以下内容是空安全的:
if(couldbenull instanceof Comparable comp){
return comp.compareTo(somethingElse);
}
//java < 14
if(couldbenull instanceof Comparable){
return ((Comparable)couldbenull).compareTo(somethingElse);
}