2014-09-08 2 views
4
String s = null; 
s = s + "hai"; 
System.out.println(s); 

Выход:`null` рассматривается как String?

nullhai 

думал, что это бросить меня NPE.

Что фундаментальная логика

  • не бросание NPE при использовании + (конкатенации)
  • метания NPE при использовании .
+1

Язык спецификации определяет его работать, как это; см.: http://docstore.mik.ua/orelly/java/fclass/ch02_03.htm –

ответ

4

For, s = s + "hai"; Внутренний, String.valueOf(null) будет называться. Этот метод преобразует null в "null".

код Байт:

public static void main(java.lang.String[]) throws java.lang.Exception; 
    0: aconst_null 
    //some code 
    10: invokestatic #27; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;// check this line 
// some other code 
     27: return 
3

Нет, это wont.Compiler заменяет Объединение строк с StringBuilder операций который не дает исключение нулевого указателя. Компилятор делает все это и поддерживает наше время написания кода котельной. Фактически нет такой вещи, как String конкатенации как строка является неизменен

декомпилированного код: -

String s = null; 
    s = (new StringBuilder(String.valueOf(s))).append("hai").toString(); 
    System.out.println(s); 

Таким образом, ответ на ваш вопрос.

  1. Компилятор внутренне изменяет + операции конкатенации с использованием StringBuilder и String.valueOf operations.So компилятор гарантирует, что нулевые случаи будут обрабатываться
  2. Во время использования . оператора на String Например, вы вызываете методы, определенные в String экземпляра, такие как String.concat(String str), который даст NullPointerException, если ваш String экземпляр является нулевым
+1

Думаю, вам стоит больше подчеркнуть, что 'String.valueOf()' вызывается внутри.Без valueOf() вы получите NPE. :) – TheLostMind

+0

@TheLostMind Я думаю, что я ответил, как конкатенация строк работает с использованием оператора +, но да. String.valueOf важен. –

+0

Ничего себе, поэтому мне было бесполезно преобразовать s + = "some text \ n"; (10 из этих строк) в построитель строк? Компилятор делает это уже для предотвращения инициализации столь многих строк? – CausingUnderflowsEverywhere

1

NullPointerException брошено только если вы пытаетесь вызвать метод на ссылки, которая null (или пытается получить доступ к полю его, или вручную бросить NullPointerException).

Это не происходит в вашем случае, потому что ваш null ссылка будет преобразована в "null"String, ни один метод не будет вызываться на локальной переменной s.

Так, например:

String s = null; 
boolean isNull = s == null; // This is ok, just testing the value of s 
s.toString();    // NPE, s is null 

Также обратите внимание, что статические поля могут быть доступны, даже если переменная null:

s.valueOf(12);    // THIS IS ALSO OK, valueOf(int) is static 
// It is equivalent to: 
String.valueOf(12); 
+0

Это интересно! Для статических методов будут ли ссылки на класс? Я имею в виду; 's.XXX' эквивалентен' String.XX'? – VinayVeluri

+1

Да, это эквивалентно, что уже указано в моем ответе. – icza

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