SomeClass的null实例是否返回false或引发NullPointerException?


当前回答

不,在调用instanceof之前不需要进行null检查。如果其值为空,则始终返回false。

根据Java语言规范,使用instanceof进行比较。

在运行时,如果RelationalExpression的值不为空,引用可能在不引发ClassCastException的情况下强制转换为ReferenceType。否则结果为假

因此,我们可以推断java也有一种叫做null类型的东西,并且在instanceof运算符中检查这个null类型,因为它需要一个特定的类型,所以显然返回false。

Java编程语言中有两种类型:原始类型和引用类型。根据Java规范的类型和值

还有一种特殊的null类型,它没有名字。因为空类型没有名称,所以不可能声明null类型的变量或强制转换为null类型。null引用是null表达式的唯一可能值类型空引用始终可以进行扩展引用转换为任何引用类型。

从Java14开始,特别是在LTS Java17中,我们有一个增强的实例。我们有模式匹配功能,在类型比较后执行强制转换。

实例

public static void main(String[] args) {
    Object testObject = "I am a string";
    List<Object> testList = null;
    if (testList instanceof List) {
        System.out.println("instance of list");
    } else {
        System.out.println("null type");
    }
    //Enhanced instanceof with type conversion - tested with JDK 17
    if (testObject instanceof String str) {
        System.out.println(str.toUpperCase());
    }
}

输出

null type
I AM A STRING

其他回答

使用空引用作为instanceof的第一个操作数将返回false。

不,在调用instanceof之前不需要进行null检查。如果其值为空,则始终返回false。

根据Java语言规范,使用instanceof进行比较。

在运行时,如果RelationalExpression的值不为空,引用可能在不引发ClassCastException的情况下强制转换为ReferenceType。否则结果为假

因此,我们可以推断java也有一种叫做null类型的东西,并且在instanceof运算符中检查这个null类型,因为它需要一个特定的类型,所以显然返回false。

Java编程语言中有两种类型:原始类型和引用类型。根据Java规范的类型和值

还有一种特殊的null类型,它没有名字。因为空类型没有名称,所以不可能声明null类型的变量或强制转换为null类型。null引用是null表达式的唯一可能值类型空引用始终可以进行扩展引用转换为任何引用类型。

从Java14开始,特别是在LTS Java17中,我们有一个增强的实例。我们有模式匹配功能,在类型比较后执行强制转换。

实例

public static void main(String[] args) {
    Object testObject = "I am a string";
    List<Object> testList = null;
    if (testList instanceof List) {
        System.out.println("instance of list");
    } else {
        System.out.println("null type");
    }
    //Enhanced instanceof with type conversion - tested with JDK 17
    if (testObject instanceof String str) {
        System.out.println(str.toUpperCase());
    }
}

输出

null type
I AM A STRING

不,不是。如果第一个操作数为空,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/1520.2。类型比较运算符实例

在运行时,如果RelationalExpression的值不为null,则instanceof运算符的结果为true,并且引用可以在不引发ClassCastException的情况下强制转换为ReferenceType。否则,结果为假。

API/Class#isInstance(对象)

如果此Class对象表示接口,则如果指定object参数的类或任何超类实现了此接口,则此方法返回true;否则返回false。如果此Class对象表示基元类型,则此方法返回false。

作为一个小插曲:

偶数(((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:false的实例。)


备注:如果你正在招聘,请不要将此作为求职面试问题D