【问题标题】:why valueOf(null) calls the constructor valueOf(char[])为什么 valueOf(null) 调用构造函数 valueOf(char[])
【发布时间】:2014-01-13 13:57:28
【问题描述】:
String.valueOf(null);
  1. 为什么会调用valueOf(char[] c) 而为什么不调用valueOf(Object o); ??
  2. 为什么String.valueOf(null); 产生NullPointerExceptionString.valueOf((Object)null); 不产生任何异常?

【问题讨论】:

  • 因为 valueOf(char[] data) 是 null 可以适应的第一种方法(因为 Array 是 Object)。
  • 将调用最具体的方法。 null 不是对象,使 char[] c 更具体。
  • @ᴍarounᴍaroun null 一个对象,与Object类型的赋值兼容。
  • @MarkoTopolnik 我不明白。 AFAIK,null 不是对象,实际上是对象的“不存在”。
  • OP,至于你的2.,Javadoc的引用会满足你,还是想撬开JDK API设计者的脑袋?

标签: java string value-of


【解决方案1】:

当不止一种重载方法成为可能的目标时,将使用最具体的方法。

因此,如果您传入char[],那么valueOf(char[])valueOf(Object) 是可能的,但valueOf(char[]) 更具体。因此会调用那个。

现在null 有点奇怪,因为它是每个非原始类型的合法值,所以它可以作为任何这些方法的参数。而且仍然valueOf(char[])valueOf(Object) 更具体,因此将调用第一个。

【讨论】:

  • 对此的推论是,如果没有一个最具体的重载(例如,如果还有 valueOf(String) - 没有一个选项比其他选项 all 更具体) 那么你会得到一个编译错误。
【解决方案2】:

String.valueOf((Object) null) 调用以下方法:

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

如你所见,null case是托管的。

String.valueOf(null) 调用以下方法:

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

它自己调用:

public String(char value[]) {
    this.offset = 0;
    this.count = value.length; // <-- NPE
    this.value = StringValue.from(value);
}

【讨论】:

  • 很好地解释了什么,但它并没有真正涵盖为什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 2019-01-09
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多