Есть ли в компиляторе Java ошибка с предупреждением / ошибкой «назначение не имеет эффекта» - PullRequest
3 голосов
/ 27 сентября 2019

Похоже, что в компиляторе java (Jdk8) отсутствует предупреждение для назначений типа 'j = j ++;'которые не имеют никакого эффекта, но вместо этого он генерирует предупреждения для назначений, таких как 'j = ++ j;'это на самом деле имеет эффект.Я приложил скрипт для демонстрации.

Обратите внимание, что вы должны выбрать соответствующий флаг для сообщения об ошибках присваивания в компиляторе Java настройки компилятора Java

public static void main(String[] args) {
    int j = 0;
    j = ++j; //Compiler warning: The assignment to variable j has no effect
    System.out.println("j="+j); //Prints 1

    int i = 0;
    i = i++; //Compiler warning: 'None'     
    System.out.println("i="+i); //Prints 0
}

Это ошибка компилятора Java?

1 Ответ

5 голосов
/ 27 сентября 2019

Но предупреждение и отсутствие предупреждения правильно :

  • Часть j = в j = ++j не имеет никакого эффекта;j уже содержит обновленное значение.Поэтому предупреждение имеет смысл.
  • Но часть i = в i = i++ оказывает влияние: после увеличения i до 1 ему присваивается значение 0 -результат выражения правой руки.Таким образом, предупреждение «не имеет никакого эффекта» не только не требуется, оно будет неправильно.

Возможно, у вас есть аргумент для другого предупреждения для случая i, но в целом,компилятор не выполняет огромное количество операций по проверке (проверяет наличие вероятных логических ошибок, но не является ошибками language ).

Следует отметить, что компилятор OpenJDK не 'не выдавать никаких предупреждений для данного кода.Eclipse имеет свой собственный компилятор, и этот компилятор делает больше предупреждений, так что ... вы можете запросить у них запрос на добавление предупреждения для случая i = i++, что-то вроде «Побочные эффекты в выражении с правой стороны сводятся на нет»по заданию "или что-то подобное.

...