Подтвердить что ты не робот

Строки Java Строки

class Test {
    public static void main() {
        String s1 = null + null; //shows compile time error
        String s1 = null;
        String s2 = s1 + null;   //runs fine
    }
}

Может кто-нибудь объяснить причину такого поведения?

4b9b3361

Ответ 1

Этот код:

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";

Ответ 2

Оператор + в качестве конкатенации 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, поэтому может возникнуть конкатенация строк.

Ответ 3

В приведенном ниже примере вы выполняете операцию над двумя операциями null и + не определены для двух null.

String s1 = null + null;

И в этом вы выполняете конкатенацию String с помощью null.

String s2 = s1 + null;

И еще один интересный случай:

String abcd = (String) null + null;

Это будет приведено в строке "nullnull", когда вы отбрасываете String в null и снова будет выполняться конкатенация. поэтому сначала null будет рассматриваться как String.

Ответ 4

От Javadoc:

Язык Java обеспечивает специальную поддержку для строки оператор конкатенации (+), а для преобразования других объектов в строки. Конкатенация строк осуществляется через Класс StringBuilder (или StringBuffer) и его метод append

Таким образом, по крайней мере левый операнд не должен быть нулевым, поскольку StringBuffer.append(Object object) принимает Object (включая null) в качестве параметра.

Ответ 5

В основном это потому, что вы имеете дело с литералами, и из-за этого COMPILER пытается выполнить операцию над этими буквальными значениями. Это происходит во время компиляции, и нет ничего общего с двумя нулевыми значениями.

Ошибка компилятора, полученная вами, является эквивалентом исключения - компилятор не знает, что с ним делать, поэтому он выдает ошибки и дает типы объяснения, говорящие, что это не работает.