2014-01-13 3 views
4
String.valueOf(null); 
  1. почему valueOf(char[] c) называется и почему не valueOf(Object o); ??
  2. Почему String.valueOf(null); производит NullPointerException и String.valueOf((Object)null); не является исключением?
+0

Поскольку valueOf (char [] data) - это первый метод, для которого null может быть адаптирован (в качестве массива - объект). –

+1

Назовем наиболее конкретный метод. 'null' не является объектом, что делает' char [] c' более конкретным. – Maroun

+0

@ ᴍarounᴍaroun 'null' * is * a Объект, как при назначении, совместим с типом' Object'. –

ответ

1

String.valueOf((Object) null) вызывает следующий метод:

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

Как вы можете видеть, нулевой случай управляется.

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); 
} 
+1

Хорошее объяснение того, что, на самом деле это не покрывает причину, почему –

3

Всякий раз, когда более чем один перегруженные Митос будет возможной мишенью наиболее специфичный один можно было бы использовать.

Так что, если вы передаете в char[] затем valueOf(char[]) и valueOf(Object) было бы возможно, но valueOf(char[]) более специфичен. Поэтому тот будет называться.

В настоящее время null является своеобразным, потому что это юридическое значение для каждого не примитивного типа, поэтому он может быть аргументом для любого из этих методов. И ещеvalueOf(char[]) более конкретно, чем valueOf(Object), поэтому будет называться первый.

+2

. Следствием этого является то, что если нет единственной наиболее конкретной перегрузки (например, если бы существовало также 'valueOf (String)' - ни один вариант не является более конкретным чем _all_ другие), тогда вы получите ошибку компиляции. –

Смежные вопросы