java字符串为空抛出异常_为什么String.valueOf(null)抛出NullPointerException?

问题是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"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值