猿问

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

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


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


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


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

它会抛出NPE吗?(如果您不相信,请自己尝试!)


    线程“主”中的异常java.lang.NullPointerException

    在java.lang.String。(未知来源)

    在java.lang.String.valueOf(未知来源)

怎么会这样呢?文件在骗我吗?这是Java中的主要错误吗?


米琪卡哇伊
浏览 771回答 3
3回答

子衿沉夜

问题是String.valueOf方法已重载:String.valueOf(Object)String.valueOf(char[])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"相关问题多态多义性如何区分?Java中将为空选择哪个重载?故事的道德启示有几个重要的方面:有效的Java 2nd Edition,项目41:明智地使用重载仅仅因为您可以超载,并不意味着您每次都应该它们可能引起混乱(尤其是如果方法做的事情截然不同的话)使用良好的IDE,您可以检查在编译时选择了哪个重载使用Eclipse,您可以将鼠标悬停在上面的表达式上,并看到确实valueOf(char[])选择了重载!有时您想显式投射null(以下示例)也可以看看多态性vs覆盖vs重载方法重载。你可以过度使用它吗?铸造时 null至少有两种情况需要显式转换null为特定引用类型:选择重载(如上例所示)为了给null作为单个参数的可变参数参数后者的一个简单示例如下: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将始终选择与提供的参数一起使用的最特定版本的重载方法。null是Object参数的有效值,但也是char[]参数的有效值。要使Java使用该Object版本,请null通过变量传入或指定对Object的显式强制转换:Object o = null;System.out.println("String.valueOf(null) = " + String.valueOf(o));// orSystem.out.println("String.valueOf(null) = " + String.valueOf((Object) null));
随时随地看视频慕课网APP

相关分类

Java
我要回答