会null instanceof SomeClass
返回false
还是抛出NullPointerException
?
会null instanceof SomeClass
返回false
还是抛出NullPointerException
?
Answers:
不,在使用instanceof之前不需要进行空检查。
表达式x instanceof SomeClass
是false
if x
is null
。
在Java语言规范的15.20.2节“类型比较运算符instanceof”中:
“在运行时,
instanceof
运算符的结果 是,true
如果RelationalExpression 的值不是null
,并且引用可以强制转换为ReferenceType 而不会引发ClassCastException
。否则,结果是false
。”
因此,如果操作数为null,则结果为false。
try it
因为当前行为与保证行为不同而更正确。
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
运算符是将近20年前发布的Java 1.0的一部分。现在不大可能以破坏现有代码的方式更改行为,而缺少某些好处却无法弥补巨大的成本。二十年前,如果可以强制转换参数,或者为null参数抛出异常,则可能存在返回true的参数。但是这些定义将需要单独的空检查。
确实,这是一个很好的问题。我只是为自己而努力。
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.2.2。类型比较运算符instanceof
在运行时,
instanceof
运算符的结果是:true
如果RelationalExpression的值不是null
,并且引用可以强制转换为ReferenceType而不引发ClassCastException
。否则结果为false
。
API / Class#isInstance(Object)
如果此
Class
对象表示一个接口,true
则如果指定Object
参数的类或任何超类实现此接口,则此方法返回;否则,该方法返回。否则返回false
。如果此Class
对象表示原始类型,则此方法返回false
。
s
只是一个对象引用变量。它可以引用实际存在的object(""
),也可以引用原null
义引用。
null
不是字符串数据,无论指向哪个变量。 例如s instanceof String
,与并不相同field.getType().equals(String.class)
。
s instanceof String
中将s
gets替换为实际值,因此它将变为"" instanceof String
and null instanceof String
。这样思考可能更有意义。
不,这不对。如果其第一个操作数为,instanceof
则将返回。false
null
就像一个花絮:
甚至还会回来。(
((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
。)
PS:如果您正在招聘,请不要将其用作求职面试问题。:D
没有。Java文字null
不是任何类的实例。因此,它不能是任何类的实例。instanceof
将返回一个false
或true
因此<referenceVariable> instanceof <SomeClass>
返回,false
当referenceVariable
value为null时。
该instanceof
运营商并不需要显式的null
检查,因为它不会抛出NullPointerException
,如果操作数null
。
在运行时,instanceof
如果关系表达式的值不为真,则运算符的结果为true,null
并且可以将引用强制转换为引用类型而不会引发类强制转换异常。
如果操作数为null
,则instanceof
操作符返回false
,因此不需要显式的null检查。
考虑以下示例,
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");
}
}