为什么String.valueOf(null)导致空指针异常?其中预期的行为是返回“null”字符串。
String x = null;
System.out.println(String.valueOf(x));
这会给出一个“null”字符串。但是
System.out.println(String.valueOf(null));
将导致空指针异常。
答案 0 :(得分:18)
因为String.valueOf(null)
选择带有char[]
参数的重载方法,然后在new String(null)
构造函数中失败。这个选择是在编译时完成的。
如果要使用Object
参数显式使用重载方法,请使用:
String.valueOf((Object) null)
请注意,没有重载方法采用String
参数 - 在第一种情况下调用的方法是Object
。
引用JLS:
15.12.2编译时步骤2:确定方法签名
第二步搜索上一步中为成员方法确定的类型。此步骤使用方法的名称和参数表达式的类型来定位可访问和适用的方法,即可以在给定参数上正确调用的声明。可能存在多于一种这样的方法,在这种情况下,选择最具体的方法。最具体方法的描述符(签名加返回类型)是在运行时用于执行方法调度的方法。
所有方法都适用,所以我们转到:
15.12.2.5选择最具体的方法
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。
感谢polygenelubricants - 只有两个重载方法接受一个对象 - char[]
和Object
- char[]
是最具体的。