String x = (String) null;
为什么这句话没有例外?
String x = null; System.out.println(x);
但是 .toString()方法应该抛出一个空指针异常。
.toString()
Println(Object)使用String.valueOf()
Println(Object)
String.valueOf()
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
Print(String)做空检查。
Print(String)
public void print(String s) { if (s == null) { s = "null"; } write(s); }
这是有意为之。可以将null转换为任何引用类型。否则你就不能把它赋值给引用变量。
null
你可以将null转换为任何引用类型而不会得到任何异常。
println方法不抛出空指针,因为它首先检查对象是否为空。如果为null,则只打印字符串"null"。否则它将调用该对象的toString方法。
println
"null"
toString
添加更多细节:内部打印方法对输入对象调用String.valueOf(object)方法。在valueOf方法中,此检查有助于避免空指针异常:
String.valueOf(object)
valueOf
return (obj == null) ? "null" : obj.toString();
为了消除您的困惑,在空对象上调用任何方法都应该抛出空指针异常,如果不是特殊情况的话。
打印:
打印一个对象。由string . valueof (Object)方法生成的字符串被转换为字节
返回对象的值:
如果参数为null,则字符串等于"null";否则,返回obj.toString()的值。
当对象为null时,它将返回一个值为“null”的字符串。
可以将null转换为任何引用类型。你也可以调用将null作为参数处理的方法,例如System.out.println(Object),但你不能引用null值并对其调用方法。
System.out.println(Object)
顺便说一句,有一个棘手的情况,似乎你可以调用null值的静态方法。
Thread t = null; t.yield(); // Calls static method Thread.yield() so this runs fine.
强制转换空值对于以下构造是必需的,其中一个方法是重载的,如果将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)
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转换为任何引用类型
而且
如果参数为null,则字符串等于"null"
我想知道这是在哪里指定的,并查看了Java规范:
空引用总是可以被赋值或转换为任何引用类型(§5.2,§5.3,§5.5)。
如果引用为空,则转换为字符串“null”(四个ASCII字符n, u, l, l)。
这种语言特性在这种情况下很方便。
public String getName() { return (String) memberHashMap.get("Name"); }
如果memberHashMap.get("Name")返回null,您仍然希望上面的方法返回null而不抛出异常。不管类是什么,null都是null。