协慌网

登录 贡献 社区

在调用 instanceof 之前需要进行空检查吗?

null instanceof SomeClass返回false还是抛出NullPointerException

答案

不,在使用 instanceof 之前不需要进行空检查。

如果xnull则表达式x instanceof SomeClassfalse

从 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 之前不需要进行空检查。

如果xnull则表达式x instanceof SomeClassfalse

从 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