class Test {
public static void main() {
String s1 = null + null; //shows compile time error
String s1 = null;
String s2 = s1 + null; //runs fine
}
}
Может кто-нибудь объяснить причину такого поведения?
class Test {
public static void main() {
String s1 = null + null; //shows compile time error
String s1 = null;
String s2 = s1 + null; //runs fine
}
}
Может кто-нибудь объяснить причину такого поведения?
Этот код:
String s1 = null + null;
пытается выполнить операцию добавления на два null
, что недопустимо.
а здесь:
String s1 = null;
String s2 = s1 + null;
Вы назначили null
на s1
. Затем вы выполняете конкатенацию s1
и null
. Тип s1
равен String
, поэтому null
в s1 + null
будет преобразован в строку "null"
в соответствии с правилами преобразования строк, как в JLS & sect; 15.1.11 - Преобразование строк:
Если ссылка имеет значение null, она преобразуется в строку
"null"
(четыре ASCII-символыn, u, l, l
).В противном случае преобразование выполняется, как если бы путем вызова
toString
метод ссылочного объекта без аргументов; но если результатом вызова методаtoString
являетсяnull
, тогда строка"null"
используется вместо этого.
и конкатенация будет выполнена как - s1 + "null";
Оператор +
в качестве конкатенации String
применяется только в том случае, если один (или оба) операндов имеют тип String
.
Это определено в Спецификации языка Java
Если тип любого операнда оператора
+
равенString
, то операция представляет собой конкатенацию строк.
В
String s1 = null + null; //shows compile time error
операнды имеют тип null
, т.е. не String
, поэтому конкатенация строк не происходит. Java затем думает, что вы делаете дополнение, которое также не работает с типами null
.
В
String s2 = s1 + null; //runs fine
s2
имеет тип String
, хотя он ссылается на null
, поэтому может возникнуть конкатенация строк.
В приведенном ниже примере вы выполняете операцию над двумя операциями null
и +
не определены для двух null
.
String s1 = null + null;
И в этом вы выполняете конкатенацию String
с помощью null
.
String s2 = s1 + null;
И еще один интересный случай:
String abcd = (String) null + null;
Это будет приведено в строке "nullnull", когда вы отбрасываете String
в null
и снова будет выполняться конкатенация. поэтому сначала null
будет рассматриваться как String
.
От Javadoc:
Язык Java обеспечивает специальную поддержку для строки оператор конкатенации (+), а для преобразования других объектов в строки. Конкатенация строк осуществляется через Класс StringBuilder (или StringBuffer) и его метод
append
Таким образом, по крайней мере левый операнд не должен быть нулевым, поскольку StringBuffer.append(Object object)
принимает Object
(включая null
) в качестве параметра.
В основном это потому, что вы имеете дело с литералами, и из-за этого COMPILER пытается выполнить операцию над этими буквальными значениями. Это происходит во время компиляции, и нет ничего общего с двумя нулевыми значениями.
Ошибка компилятора, полученная вами, является эквивалентом исключения - компилятор не знает, что с ним делать, поэтому он выдает ошибки и дает типы объяснения, говорящие, что это не работает.