gpt4 book ai didi

Java String.valueOf(null) 抛出 NPE,但 Object a = null; String.valueOf(a) 返回 'null'

转载 作者:IT老高 更新时间:2023-10-28 20:51:26 24 4
gpt4 key购买 nike

对于以下行为是否有逻辑语言设计类型的解释(Java 7,我也怀疑早期版本):

    Object  a = null;
String as = String.valueOf(a); // as is assigned "null"
System.out.println(as+":"+as.length()); // prints: "null:4"
System.out.println ( String.valueOf(null)); // NPE

最佳答案

在语句System.out.println(String.valueOf(null));中有一个方法public static String valueOf(char data[])的调用,其中源码如下:

public static String valueOf(char data[]) {
return new String(data);
}

这就是您获得 NPE

的原因

另一方面,在语句 Object a = null; String as = String.valueOf(a);有一个方法public static String valueOf(Object obj)的调用,源码如下:

public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

这就是为什么你得到 "null" 而不是 NPE


来自 Java 语言规范的一点理论:15.12.2.5 Choosing the Most Specific Method

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

char[] 属于 Object 类型,但并非所有 Object 都属于 char[] 类型. char[] 类型比 Object更具体,如 Java 语言规范中所述,String.valueOf(char[]) 重载是在这种情况下选择。

编辑

还值得一提的是Ian Roberts提到(在他下面的评论中):

It's important to note that it's a compile error if there is no single overloading that is more specific than all the others - if there were a valueOf(String) method as well as valueOf(Object) and valueOf(char[]) then a call to the untyped String.valueOf(null) would be ambiguous

关于Java String.valueOf(null) 抛出 NPE,但 Object a = null; String.valueOf(a) 返回 'null',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com