繁体   English   中英

为什么 String.valueOf(null) 会抛出 NullPointerException?

[英]Why does String.valueOf(null) throw a NullPointerException?

根据文档,方法String.valueOf(Object obj)返回:

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

但是当我尝试这样做时怎么办:

System.out.println("String.valueOf(null) = " + String.valueOf(null));

它会抛出 NPE 吗? (不信自己试试!)

Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.(Unknown Source)
    at java.lang.String.valueOf(Unknown Source)

怎么会这样? 文档在骗我吗? 这是Java中的一个主要错误吗?

问题是String.valueOf方法已重载

Java 规范语言要求在这种情况下,选择最具体的重载

JLS 15.12.2.5 选择最具体的方法

如果多个成员方法既可访问又适用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。 Java 编程语言使用选择最具体的方法的规则。

一个char[]是一个Object ,但不是所有的Object都是一个char[] 因此, char[]Object更具体,并且按照 Java 语言的规定,在这种情况下选择String.valueOf(char[])重载。

String.valueOf(char[])期望数组为非null ,并且由于在这种情况下给出了null ,因此它会抛出NullPointerException

简单的“修复”是将null显式转换为Object ,如下所示:

System.out.println(String.valueOf((Object) null));
// prints "null"

相关问题


故事的道德启示

有几个重要的:

  • Effective Java 2nd Edition,Item 41:明智地使用重载
    • 仅仅因为你可以超载,并不意味着你每次都应该
    • 它们会引起混乱(尤其是如果这些方法做的事情大不相同)
  • 使用好的IDE,可以检查编译时选择了哪个重载
    • 使用 Eclipse,您可以将鼠标悬停在上述表达式上,并看到确实选择valueOf(char[])重载!
  • 有时您想显式地强制转换为null (要遵循的示例)

也可以看看


在铸造null

至少有两种情况需要将null显式转换为特定的引用类型:

  • 选择重载(如上例所示)
  • null作为单个参数提供给 vararg 参数

后者的一个简单示例如下:

static void vararg(Object... os) {
    System.out.println(os.length);
}

然后,我们可以有以下内容:

vararg(null, null, null); // prints "3"
vararg(null, null);       // prints "2"
vararg(null);             // throws NullPointerException!

vararg((Object) null);    // prints "1"

也可以看看

相关问题

问题是您正在调用String.valueOf(char[])不是String.valueOf(Object)

这样做的原因是 Java 将始终选择使用提供的参数的重载方法的最具体版本。 nullObject参数的有效值,但它也是char[]参数的有效值。

要使 Java 使用Object版本,请通过变量传入null或指定对 Object 的显式转换:

Object o = null;
System.out.println("String.valueOf(null) = " + String.valueOf(o));
// or
System.out.println("String.valueOf(null) = " + String.valueOf((Object) null));

早在 2003 年,就以这种方式提交了编号为4867608的错误,并在此解释下将其解决为“无法修复”。

由于兼容性限制,我们无法更改此设置。 请注意,它最终被调用的是公共静态 String valueOf(char data[]) 方法,并且它没有提到将“null”替换为空参数。

@###.### 2003-05-23

在 Scala 中使用String.valueOf(null: Any)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM