String x = (String) null;

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

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

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


当前回答

正如其他人所写的那样,您可以将所有内容转换为null。 通常,你不需要这样做,你可以这样写:

String nullString = null;

不用打石膏。

但在某些情况下,这种类型转换是有意义的:

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

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

如果你打字的话,情况就不一样了

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

b)如果你打算使用IDE来生成代码;例如,我通常写单元测试:

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

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

其他回答

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

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

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

打印:

打印一个对象。由string . valueof (Object)方法生成的字符串被转换为字节

返回对象的值:

如果参数为null,则字符串等于"null";否则,返回obj.toString()的值。

当对象为空时,它将简单地返回值为“null”的字符串。

正如其他人所写的那样,您可以将所有内容转换为null。 通常,你不需要这样做,你可以这样写:

String nullString = null;

不用打石膏。

但在某些情况下,这种类型转换是有意义的:

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

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

如果你打字的话,情况就不一样了

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

b)如果你打算使用IDE来生成代码;例如,我通常写单元测试:

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

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

可以将null转换为任何引用类型,而不会得到任何异常。

println方法不抛出空指针,因为它首先检查对象是否为空。如果为null,则输出字符串“null”。否则它将调用该对象的toString方法。

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

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

为了消除您的困惑,在空对象上调用任何方法都应该抛出空指针异常,如果不是特殊情况的话。

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