String x = (String) null;

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

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

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


当前回答

很多答案已经提到了

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

and

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

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

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

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

其他回答

强制转换空值对于以下构造是必需的,其中一个方法是重载的,如果将null传递给这些重载的方法,那么编译器不知道如何清除歧义,因此我们需要在这些情况下强制转换null:

class A {
  public void foo(Long l) {
    // do something with l
  }
  public void foo(String s) {
    // do something with s      
  }
}
new A().foo((String)null);
new A().foo((Long)null);

否则,您无法调用所需的方法。

这在使用可能具有歧义的方法时非常方便。例如:JDialog具有以下签名的构造函数:

JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)

我需要使用这个构造函数,因为我想设置GraphicsConfiguration,但我没有这个对话框的父项,所以第一个参数应该为空。使用

JDialog(null, String, boolean, Graphicsconfiguration) 

是模棱两可的,所以在这种情况下,我可以通过将null转换为支持的类型之一来缩小调用:

JDialog((Frame) null, String, boolean, GraphicsConfiguration)

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);
}

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

很多答案已经提到了

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

and

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

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

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

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