String x = (String) null;

为什么这个说法没有例外?

String x = null;
System.out.println(x);

它输出null。但是. tostring()方法应该抛出空指针异常。


当前回答

这种语言特性在这种情况下很方便。

public String getName() {
  return (String) memberHashMap.get("Name");
}

如果memberHashMap.get("Name")返回null,您仍然希望上面的方法返回null而不抛出异常。不管类是什么,null都是null。

其他回答

Println(Object)使用String.valueOf()

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Print(String)检查空值。

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
}

这种语言特性在这种情况下很方便。

public String getName() {
  return (String) memberHashMap.get("Name");
}

如果memberHashMap.get("Name")返回null,您仍然希望上面的方法返回null而不抛出异常。不管类是什么,null都是null。

这是有意为之。可以将null转换为任何引用类型。否则你就不能把它赋值给引用变量。

很多答案已经提到了

可以将null转换为任何引用类型

and

如果参数为null,则字符串等于"null"

我想知道这是在哪里指定的,并查看了Java规范:

空引用总是可以被赋值或转换为任何引用类型(§5.2,§5.3,§5.5)。

如果引用为空,则转换为字符串“null”(四个ASCII字符n, u, l, l)。

可以将null转换为任何引用类型。你也可以调用将空值作为参数处理的方法,例如System.out.println(Object),但是你不能引用空值并调用它的方法。

顺便说一句,有一个棘手的情况,似乎你可以调用空值的静态方法。

Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.