Ожидается переменная

private void calculateForEachQuestion() {
    ...
    if (questions.size() >= answers.size()) {
        answers.forEach(answer -> {
            if (questions.contains(answer))
                this.answer.setPoints((this.answer.getPoints())++);
                // Variable expected  ^                    
    });
}

Ошибка, с которой я столкнулся:

неожиданный тип
требуется: переменная
найдено: значение

Что не так с заявлением?

this.answer.setPoints((this.answer.getPoints())++);

person Andrew Tobilko    schedule 22.03.2016    source источник
comment
Вы должны указать точную ошибку, которую вы видите.   -  person Paul Hicks    schedule 23.03.2016
comment
Если постинкремент работает так же в Java, как и в C (весьма вероятно), то даже если синтаксис был правильным, вы все равно получите то же значение...   -  person Jongware    schedule 23.03.2016
comment
Я не думаю, что вы можете использовать ++ для значения, оно ожидает переменную. Вместо этого попробуйте +1.   -  person markspace    schedule 23.03.2016
comment
Похоже, вы неправильно поняли, что означает this.   -  person RaminS    schedule 23.03.2016
comment
Почему бы просто не написать answer.setPoints(answer.getPoints()+1);?   -  person RaminS    schedule 23.03.2016


Ответы (4)


Оператор ++ имеет смысл только при применении к объявленной переменной.

Этот оператор добавит единицу к integer, long и т. д. и сохранит результат в той же переменной на месте.

Если нет объявленной переменной, то некуда сохранить результат, из-за чего компилятор ругается.

Один из способов разрешить использование оператора ++ в этой ситуации (не самый краткий код, но для иллюстрации):

int myVariable = this.answer.getPoints();
myVariable++;
this.answer.setPoints(myVariable);
person qwwqwwq    schedule 22.03.2016

this.answer.getPoints() вернет значение, и вы не можете использовать приращение ++ или уменьшение -- для этого. Вы можете использовать его только для переменных.

Если вы хотите добавить к нему 1, вы можете сделать это как:

this.answer.setPoints((this.answer.getPoints())+1);

Я это знаю, но почему?

Ты можешь сделать это:

int x = 5;
x++; // x is a variable and can have value 6

но не это:

5++; // 5 is a value and can't have value 6
person user3437460    schedule 22.03.2016

Измените это:

this.answer.setPoints((this.answer.getPoints())++);

to:

this.answer.setPoints((this.answer.getPoints())+1);

++ увеличит переменную на 1, но поскольку this.answer.getPoints() вернет значение, а не определенную переменную, он не сможет сохранить увеличенное значение.

Думайте об этом как о выполнении: this.answer.getPoints() = this.answer.getPoints() + 1, где будет храниться увеличенное значение?

person Atri    schedule 22.03.2016
comment
Почему бы не опустить this? Это совершенно ненужно, не так ли? - person RaminS; 23.03.2016
comment
@AndrewTobilko, потому что вы не можете изменить возвращаемое значение метода, а ++ изменяет переменную, для которой он используется? - person Louis Wasserman; 23.03.2016

Ошибка как раз в этом бите:

(this.answer.getPoints())++

Первая часть этого (this.answer.getPoints()) создает rvalue: по сути, анонимную переменную, которая практически не существует во времени.

Вторая часть ++ увеличивает эту анонимную переменную после ее передачи в setPoints().

Затем анонимная переменная (теперь увеличенная) отбрасывается.

Компилятор/IDE знает, что вы делаете что-то, что никогда не будет использоваться (увеличиваете временное значение), и помечает это.

person Paul Hicks    schedule 22.03.2016