Ошибка «Неправильное назначение» от оператора == - PullRequest
4 голосов
/ 29 апреля 2010

Я пытался написать простой метод:

boolean validate(MyObject o)
{
  // propertyA && propertyB are not primitive types.
  return o.getPropertyA() == null && o.getPropertyB() == null;
}

И получил странную ошибку в части == null:

Синтаксическая ошибка на токене ==. Недействительным оператор присваивания.

Может быть, моя Java ржавая после сезона в PLSQL. Поэтому я попробовал более простой пример:

Integer i = 4;
i == null;
// compile error: Syntax error on token ==. Invalid assignment operator.

Integer i2 = 4;
if (i == null); //No problem

Как это может быть?

Я использую jdk160_05.

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

if (o.propertyA() == null && o.propertyB() == null) { return true; }
else { return false; }

Ответы [ 4 ]

9 голосов
/ 29 апреля 2010

== это не оператор присваивания, это оператор логического равенства, см .:

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.21.2

Если вы хотите установить для i значение null, используйте простой оператор присваивания =:

i = null;

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.26.1

Если вы хотите проверить, что я равен нулю, вам нужно использовать оператор ==

if (i == null)
4 голосов
/ 29 апреля 2010

Мне кажется, я вижу твою проблему. Мне жаль, что другие ответы не касаются этого.

Итак, у Java есть эта идея, которая разделяется некоторыми другими языками: просто то, что что-то является допустимым выражением , не означает, что эта вещь сама по себе является действительным выражением .

Например, этот код будет жаловаться аналогично:

Integer i = 4;
i+3;    // this line gives a compilation error

И, тем не менее, очевидно, что я могу использовать i+3 (распаковать!) В другом месте, чтобы обозначать "7":

System.out.println(i+3); // this is fine

Это немного сбивает с толку, потому что в отличие от некоторых языков, которые имеют это различие выражения / оператора, java позволяет вам использовать любой вызов метода - независимо от того, возвращает он значение или нет - в качестве оператора. Однако большинство java-операторов сами по себе не формируют правильное утверждение.

Аналогично, это не компилируется:

Integer i = 4;
i;    // this line gives a compilation error

Подробную информацию смотрите в http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#32588

4 голосов
/ 29 апреля 2010

Я не думаю, что вы путаете назначение и сравнение равенства. Я думаю, что ваш компилятор просто дает вам сбивающее с толку сообщение об ошибке. Эта программа:

Integer i = 4;
i ==null; 

должно выдавать ошибку примерно так:

Program.java:8: not a statement
                 i ==null;

Ваша первая программа должна правильно скомпилироваться. Возможно, в тексте есть какой-то невидимый символ Юникода, который сбивает с толку компилятор. Попробуйте удалить всю функцию и набрать ее снова.

1 голос
/ 29 апреля 2010

В PL / SQL присвоение значения переменной выполняется с помощью оператора :=. Сравнение двух значений выполняется с помощью =.

В Java присвоение значения переменной выполняется с помощью оператора =. Сравнение двух значений выполняется с помощью == или, в некоторых случаях, .equals() метода.

Вы можете делать такие вещи:

x = i==null;

Это проверит, если i равно null, и если так, значение true будет присвоено x (при условии, что x является логическим значением).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...