Проблема конкатенации при печати объектов с помощью System.out.println (); - PullRequest
0 голосов
/ 18 марта 2020

Я учусь кодировать на Codecademy и продолжаю придумывать проблему с конкатенацией. Например, когда я написал:

System.out.println(lemonadeStand + cookieShop);

, я получил ошибку:

Store. java: 32: ошибка: неверные типы операндов для двоичного оператора '+' System.out.println (lemonadeStand + cookieShop);

Но когда я написал:

System.out.println(lemonadeStand);
System.out.println(cookieShop);

Код работал. Может кто-нибудь сказать мне, почему не работает первый? (И спасибо)

--- edit --- Спасибо всем за помощь всем! Я впервые опубликовал здесь вопрос, и я поражен тем, насколько добрым и полезным является сообщество!

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Поскольку одиночные переменные вызывают вызов их метода .toString (). Когда вы добавляете операнд между двумя нестроковыми переменными, это не совсем точно, что вы имеете в виду. Иногда вы увидите это ...

System.out.println(lemonadeStand + cookieShop + "");

То, что там "+" подтверждает, что все сводится к строке (если это какой-то способ объяснить это вам технически).

То, что также будет работать, это ...

System.out.println(lemonadeStand.toString() + cookieShop);
or...
System.out.println(String.valueOf(lemonadeStand) + cookieShop);

Это зависит от того, какие переменные на самом деле. Но если они не являются строками ... это неоднозначно относительно того, что вы говорите, чтобы сделать это ... добавить их вместе, может быть?

Размещение одного + "" где-то там есть общий способ заставить все это следует интерпретировать как конкатенацию строк.

Надеюсь, что это объясняется нетехническими терминами.

1 голос
/ 18 марта 2020

пожалуйста, перед объединением двух переменных вы должны убедиться, что они одного типа, или попробовать System.out.println (first + "" + second);

0 голосов
/ 18 марта 2020

Слишком широкий ...
Но, метод, принимающий строку, нуждается в строке в качестве параметра.
println перегружен в классе PrintStream, поэтому он принимает все примитивные типы, String и Object тип.

неверные типы операндов для бинарного оператора '+'

Дело в «бинарном» операторе. Плюс «+» обычно рассматривается как арифметический c (двоичный) оператор между двумя числами. А во-вторых, «+» МОЖЕТ БЫТЬ РАССМОТРЕН как оператор конкатенации строк. [Примечание: Java не допускает перегрузки операторов]
Двоичные, поэтому арифметические c, логические и побитовые операторы ожидают определенных типов для себя.
В случае оператора "+", чаще всего он рассматривается как оператор сложения.
Выражения с цифрами c автоматически переводятся в более крупные примитивные типы, если это необходимо.

Опять же, вызов a + b возможен только с числовыми операндами c или String. Если один из a или b не является числовым c или операндом String, будет выдано сообщение об ошибке.
Это реализации методов println / print класса PrintStream, которые пытаются получить результат по умолчанию toString метод для данного параметра.
System.out.print(...) является своего рода комбинацией объектов и вызовов. System - это статический c объект, представляющий Систему в среде выполнения, out представляет стандартный поток вывода для текущего потока, а print - метод, вызываемый для этого out PrintStream. Существует несколько различных потоков, например, err, который является стандартным потоком вывода ошибок.
Стандартный метод print или println перегружен для приема типа Object, когда эти методы пытаются вызвать toString метод на данный объект в качестве параметра. Но оно не может оценить данное выражение с операндом +, если все выражение не оценено как Number или String.

Обрезая до погони, «+» сначала работает как арифметический c оператор, если следующий оператор является строкой, он преобразует оставшуюся часть выражения в строку.
Когда «+» имеет два объекта или несовместимые операторы, он не может определить, как операнды должны быть обработаны. Как он мог бы добавить список в массив или просто true + true? Для второго (true + true) должен использоваться логический &&.
В вашем случае, когда вы попытались + между различными типами, println выдал вам ошибку, потому что "+" может только объединять строки или суммировать оба операнда, которые наследуются от класса Number.

Ответ от @Moyebang - это хорошо, потому что выражение, указанное в качестве параметра в методе printnl, соответствует типу String. Ответ @Lotsa не очень хорош, потому что операнды вычисляются слева направо, поэтому, если операнды до + несовместимы, программа выдаст ошибку (вторая часть ответа в порядке).

Такие выражения сначала оцениваются во время компиляции.
Они оцениваются по стандартным основам слева направо:

System.out.println(1 + 1 + ""); //this gives 2
System.out.println("" + 1 + 1); //this gives 11
System.out.println(1 + "" + new ArrayList<>()); //this gives 1[]
System.out.println(new ArrayList<>() + "" + 1); //this gives []1
System.out.println(new ArrayList<>() + 1 + ""); //and this gives an error

Итак, слева вычисляются математические уравнения когда это строка, другие добавляются к этой строке. Последний показывает ошибку, потому что сначала объект ArrayList добавляется к «1», где нет единого подхода к добавлению List к объекту.

...