会null instanceof SomeClass返回false还是抛出NullPointerException?
会null instanceof SomeClass返回false还是抛出NullPointerException?
Answers:
不,在使用instanceof之前不需要进行空检查。
表达式x instanceof SomeClass是falseif xis 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中将sgets替换为实际值,因此它将变为"" instanceof Stringand null instanceof String。这样思考可能更有意义。
不,这不对。如果其第一个操作数为,instanceof则将返回。falsenull
就像一个花絮:
甚至还会回来。(((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当referenceVariablevalue为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");
}
}