Поскольку Java создаст StringBuilder для добавления s1
или "abc",
к s2
или null
.
Согласно спецификации для StringBuilder.append (String) -
If str is null, then the four characters "null" are appended
Так что получается так же, как "abc" + "null"
Давайте рассмотрим пример кода (я поместил его в метод):
public static void main(String[] args)
{
String s1 = "abc";
String s2 = null;
String s3 = s1+ s2;
System.out.println(s3);
}
Если мы посмотрим на байт-код (полученный с помощью вызова javap -c):
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String abc
2: astore_1
3: aconst_null
4: astore_2
5: new #3; //class java/lang/StringBuilder
8: dup
9: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
12: aload_1
13: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: aload_2
17: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: invokevirtual #6; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
23: astore_3
24: getstatic #7; //Field java/lang/System.out:Ljava/io/PrintStream;
27: aload_3
28: invokevirtual #8; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
31: return
Java создает StringBuilder
и добавляет значения, как String
s, s1
и s2
.
Так что вам следует быть осторожным, если вы ожидали исключение NullPointerException, потому что конкатенация в Java обойдет проблему.
Примечание: Как указал Джон Скит , это в конечном итоге всего лишь 1031 * реализация деталей - это спецификация Java, которая гарантирует, что нуль при преобразовании в String превращается в "ноль". Однако этот байт-код, по крайней мере, показывает, что на самом деле происходит за кулисами.