Java int can';不能更改,因为lambda表达式必须是final或有效final

Java int can';不能更改,因为lambda表达式必须是final或有效final,java,javafx,lambda,Java,Javafx,Lambda,我正在尝试制作一个Java井字游戏,但代码有一些问题 我想做的只是在用户单击按钮时增加一个int 问题是编译器说“错误:从lambda表达式引用的局部变量必须是final或实际上是final”。我理解这意味着我只能创建一个值,不能用相同的方法重新定义它,但我对java是新手,不知道如何解决这个问题 我正在考虑通过使用多个类来解决问题,但这太复杂了,我只想像python中那样添加int。如果任何人有任何关于如何做这件事或工作的想法,那么将不胜感激 下面是我的程序 public class TicT

我正在尝试制作一个Java井字游戏,但代码有一些问题

我想做的只是在用户单击按钮时增加一个int

问题是编译器说
“错误:从lambda表达式引用的局部变量必须是final或实际上是final”
。我理解这意味着我只能创建一个值,不能用相同的方法重新定义它,但我对java是新手,不知道如何解决这个问题

我正在考虑通过使用多个类来解决问题,但这太复杂了,我只想像python中那样添加int。如果任何人有任何关于如何做这件事或工作的想法,那么将不胜感激

下面是我的程序

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);
    }

}

您没有指定错误发生的位置,但此部分应给出一个错误:

int User = 0;

B1.setOnAction((event) -> {
    B1.setText("X");
    User++;
});
User
变量需要是一个字段、一个像
AtomicInteger
newint[1]
这样的包装器,或者是一个final对象。这里有几种方法可以解决这个问题。首先,您可以将
User
设置为一个字段

private int User = 0;
然后不要在方法中声明它。您可以做的另一件事是创建一个
新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();
});

您可以使用
AtomicInteger
IntegerProperty
。简单的解决方案是将用户设置为类中的字段,而不是局部变量。(并称之为user。所有变量都应该以小写开头。大写代表类名)。您理解错误消息吗?无关:请使用java命名约定!Java确实允许对整数进行加法运算。但是,您使用的是lambda表达式,这很特殊,因为它在方法之外转义。这意味着,如果lambda在方法之外被调用,它将尝试更改局部变量
User
的值,即使不存在。这就是为什么不能在lambdas中更改局部变量。阅读文档:非常感谢我使用了一个字段并使其正常工作感谢您抽出时间来帮助我。