在Java中使用空值进行types转换时无exception

String x = (String) null; 

为什么在这个声明中没有例外?

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

它打印null 。 但.toString()方法应该抛出一个空指针exception。

您可以将null为任何引用types,而不会有任何exception。

println方法不会抛出空指针,因为它首先检查对象是否为null。 如果是null,那么它只是打印string"null" 。 否则,它将调用该对象的toString方法。

添加更多细节:内部打印方法在input对象上调用String.valueOf(object)方法。 而在valueOf方法中,这个检查有助于避免空指针偏移:

 return (obj == null) ? "null" : obj.toString(); 

对于你的困惑,调用空对象的任何方法应该抛出一个空指针exception,如果不是特例。

您可以将null为任何引用types。 您也可以调用处理null作为参数的方法,例如System.out.println(Object) ,但不能引用null值并调用一个方法。

BTW有一个棘手的情况,看来你可以调用null值的静态方法。

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

这是devise。 您可以将null为任何引用types。 否则,您将无法将其分配给引用variables。

在下面的构造中,如果方法被重载,并且如果将null传递给这些重载的方法,那么就需要使用null值,编译器不知道如何清除歧义,因此我们需要在这些情况下使用nulltypes:

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

否则,你不能调用你需要的方法。

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

打印 :

打印一个对象。 由String.valueOf(Object)方法产生的string被翻译成字节

ValueOf :

如果参数为null,那么一个string等于“null”; 否则,返回obj.toString()的值。

只有当对象为null时,才会返回值为“null”的string。

当使用否则不明确的方法时,这非常方便。 例如:JDialog具有带有以下签名的构造函数:

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

我需要使用这个构造函数,因为我想设置GraphicsConfiguration,但是我没有父对象,所以第一个参数应该是null。 运用

 JDialog(null, String, boolean, Graphicsconfiguration) 

是不明确的,所以在这种情况下,我可以通过将null强制转换为支持的types之一来缩小调用的范围:

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

正如其他人写的,你可以把任何东西都归零。 通常情况下,你不需要这样,你可以写:

 String nullString = null; 

没有把演员放在那里。

但是在某些情况下,这种表演是有道理的:

a)如果你想确保一个特定的方法被调用,如:

 void foo(String bar) { ... } void foo(Object bar) { ... } 

那么如果你input的话会有所作为

 foo((String) null) vs. foo(null) 

b)如果您打算使用您的IDE生成代码; 例如,我通常写unit testing,如:

 @Test(expected=NullPointerException.class) public testCtorWithNullWhatever() { new MyClassUnderTest((Whatever) null); } 

我在做TDD; 这意味着类“MyClassUnderTest”可能还不存在。 通过写下代码,我可以使用我的IDE来首先生成新的类。 然后生成一个构造函数接受一个“随机”参数“开箱即用” – IDE可以从我的testing中得出,构造函数应该采用一个types为Whatever的参数。

这里有很多答案已经提到

您可以将null转换为任何引用types

如果参数为空,则string等于“null”

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

空引用总是可以分配或转换为任何引用types(§5.2,§5.3,§5.5)。

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