Непонимание некоторых основных ошибок компиляции в Java - PullRequest
0 голосов
/ 25 октября 2019

Я изучаю Java уже 2 месяца, и каждый раз, когда мне кажется, что я начинаю понимать это, я понимаю, что мне все еще не хватает какой-то сильной основы.

В настоящее время работаю над подготовкой к экзамену, иОдним из упражнений является обнаружение ошибок компиляции. Хотя ответы даны, я все еще не понимаю большинство этих ошибок.

Вот код:

boolean b = true;
String s;
char c = '8';                    // unicode = 56
byte k = 6;
int i = 7;

b = !b < false;                  // compilation error #1
s = k + c + "" + (c < 8);
s = k + c + (c < 8) + "" ;       // compilation error #2
c = c + 1;                       // compilation error #3
b = b + "";                      // compilation error #4
c++;
b = true == (!(true != !(i != 7)) !=b || (c < '2'));
b = (true || false) == 1 && b;   // compilation error #5

Я понимаю ошибки # 1 и # 5.

Я не понимаю, ошибка # 2 . Кажется, это проблема с добавлением int и логического значения, но если это так, то почему нет ошибки компиляции для предыдущей строки, которая точно такая же строка кода минус позиция ""и (с <8). Я видел компиляцию без ошибок до логической строки, такой как </p>

(5 < 3) + "ok" = "falseok"

Означает ли это, что конкатенация логического значения может быть выполнена только с помощью Stringchain, но не другого примитива? Тогда почему вторая строка компилируется?

Я не понимаю ошибку # 3 . Компилятор говорит: «несовместимые типы: возможное преобразование с потерями из int в char». Почему char неявно преобразуется в int? В классе мы узнали, что byte, short и тип char могут автоматически конвертироваться в int, если в одном и том же уравнении, чем и it, так почему же это не происходит здесь?

Я не понимаю ошибку# 4 . Компилятор говорит: «несовместимые типы: java.lang.String не может быть преобразовано в логическое значение». Так же, как # 1, почему в этом случае конкатенация booleanString не принимается?

Большое спасибо.

1 Ответ

2 голосов
/ 25 октября 2019
  • # 2 происходит, потому что c<8 оценивается как boolean, который не может быть добавлен к int. В этой строке нет ошибки компиляции, потому что выражение boolean перед объединением преобразуется в String. Имейте в виду, что порядок имеет значение! Хотя s = k + c + (c < 8) + "" не является допустимым выражением, s = "" + k + c + (c < 8) равно единице.
  • # 3 происходит потому, что выражение c + 1оценивается как int, размер хранилища которого больше, чем у char, поэтому он должен быть разыгран следующим образом: (char) (c + 1).
  • # 4 происходит, потому что вы можетеНе присваивайте выражение String переменной boolean

Посмотрите на спецификацию оператора + , чтобы понять, что на самом деле происходит, и к сужение примитивного преобразования раздел, чтобы понять, зачем нужен каст.

И не беспокойтесь о том, что не поняли все с самого начала: мы все начали там. С течением времени Java приобрела некоторые особенности. Лучшее, что вы можете сделать (ИМХО), это научиться читать спецификации.

...