2012-04-12 6 views
1

Можно создать дубликат:
Concatenating null strings in JavaJava конкатенации строк - обнуляет

Я просто интересно, если кто-то может объяснить, почему следующий код работает так, как это делает:

String a = null; 
String b = null; 
String c = a + b; 
System.out.println(c.toString()); 

Это печатает «nullnull» на консоли.

Я как бы ожидал, что операция + выведет исключение или, в меньшей степени, что «c» будет null.

ответ

2

«Преобразование строк» ​​требуется оператор конкатенации, что нулевые значения должны быть сопоставлены с четырьмя символами null всякий раз, когда требуется представление строки.

Spec для преобразования строки: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.11

Spec для конкатенации строк: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1

+0

Спасибо за ответ, отлично. Я проголосовал за то, чтобы закрыть вопрос, поскольку был найден дубликат, иначе ваш будет ответом, который я бы принял – Tiago

9

, потому что код компилируется

String c = new StringBuilder().append(a).append(b).toString(); 

и StringBuilder.append(a) присоединяет результат String.valueof(a) which is "null" if a is null

+0

В данном конкретном случае, вы правы. Однако в более общем случае печати нулевых строк: http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html#print%28java.lang.String%29 & http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.11 –

+0

Это неверно, в моем случае это преобразование этой строки в 'String c = new StringBuilder (String . .valueOf (а)) добавить (б) .ToString(); '. Настоящей причиной является реализация 'String.valueOf (Object)'. – dash1e

+0

@ dash1e Это зависит от реализации действительно, кроме 'append (null)' также необходимо добавить «null» –

0

Когда ява найти null ссылки во конкатенации преобразовать его в строку "null". Таким образом, "nullnull" - правильный результат.

Перед конкатенации для каждого объекта Java вызова

java.lang.String.valueOf(Object) 

и если вы посмотрите на исходный код этого метода вы найдете этот

public static String valueOf(Object obj) { 
    return (obj == null) ? "null" : obj.toString(); 
} 
Смежные вопросы