Java int нельзя изменить, потому что лямбда-выражение должно быть окончательным или эффективно окончательным - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь сделать игру Java ti c ta c toe и у меня возникают некоторые проблемы с кодом.

Что я хочу сделать, это просто увеличить int, когда пользователь нажимает кнопку.

Проблема в том, что компилятор говорит "Error:local variables referenced from a lambda expression must be final or effectively final". Я понимаю, что это означает, что я могу только создать значение и не переопределять его тем же методом, но я новичок в java и не знаю, как это обойти.

Я думаю об обходе нескольких классов, но это слишком сложно, и я просто хочу добавить к int, как в python. Если у кого-то есть какие-либо идеи о том, как это сделать или обойти это, то это будет с благодарностью.

Ниже приведена моя программа

public class TicTacToe extends Application {

    @Override
    public void start(Stage primaryStage) {
        //Some code here

        //this is Cerateing all the buttons
        //the buttons are formated in a 3X3 array for a total of 9 buttons
        Button B1 = new Button();
        //More buttons

        //this sets the size of the button

        //this is the int that tracks what button the user has pressed
        //this is my value
        int User = 0;

        //this gets if the user has clicked any of the buttons shold in therory do somthing
        B1.setOnAction((event) -> {
            B1.setText("X");
            //this is where I want to add to an value
            User++;
        });

        //More code

        System.out.println(User);
    }

}

1 Ответ

1 голос
/ 04 мая 2020

Вы не указали, где вы получили ошибку, но эта часть должна выдавать ошибку:

int User = 0;

B1.setOnAction((event) -> {
    B1.setText("X");
    User++;
});

Переменная User должна быть либо полем, либо оболочкой типа AtomicInteger или new int[1] или конечный объект. Вот несколько способов обойти это. Прежде всего, вы можете просто сделать User полем.

private int User = 0;

Тогда не объявляйте его в методе. Другая вещь, которую вы можете сделать, это сделать new int[1].

int User = new int[]{0};

B1.setOnAction((event) -> {
    B1.setText("X");
    User[0] ++;
});

Затем при доступе к нему вы можете использовать User[0]. Другой способ - использование AtomicInteger. Мне это не очень нравится, но вот как это можно использовать:

AtomicInteger User = new AtomicInteger(0);

B1.setOnAction((event) -> {
    B1.setText("X");
    User.incrementAndGet();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...