This question already has answers here:
Cannot refer to a non-final variable inside an inner class defined in a different method
                                
                                    (20个答案)
                                
                        
                4年前关闭。
            
        

我写了一些代码,一切正常,但是当我在另一台计算机上打开相同的代码时,出现以下错误:

Cannot refer to the non-final local variable usernameTextField defined in an enclosing scope
Cannot refer to the non-final local variable portTextField defined in an enclosing scope
Cannot refer to the non-final local variable usernameTextField defined in an enclosing scope
Cannot refer to the non-final local variable portTextField defined in an enclosing scope


给出此错误的代码:

private static GridPane initGUI(){
    GridPane root = new GridPane();
    TextField usernameTextField = new TextField();
    TextField portTextField = new TextField();
    Button button = new Button("Login!");
    root.add(new Label("Username:"),0,0);
    root.add(new Label("Port:"),0,1);
    root.add(usernameTextField,1,0);
    root.add(portTextField,1,1);
    root.add(button, 0, 2);

    /* Button action */
    button.setOnAction(new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent event) {
            boolean portCorrect = true;
            String username = usernameTextField.getText();
            int port = 0;

            /* Try casting to integer*/
            try{
                port = Integer.parseInt(portTextField.getText());
            }catch(NumberFormatException e){
                portCorrect = false;
            }

            /* Invalid username or port*/
            if(username.length() < 1 && portCorrect){
                usernameTextField.clear();
                portTextField.clear();
            }
        }

    });
    return root;
}


我一直在寻找解决问题的方法,并且发现了很多类似的方法,但是给定的解决方案永远无法解决我的问题。

编辑:使用Java8

EDIT2:我很感谢这些答案,但是这些都是我通过搜索问题找到的答案。他们并没有真正解决问题。我在此处粘贴的代码在我运行的每台计算机上以及项目合作伙伴的计算机上都可以正常运行,但是在我的计算机上却没有。将对象更改为最终作品,但这并不是我真正想要的。

最佳答案

可能您正在使用Java 8,而另一台计算机正在使用Java7。Java要求对内部类中的变量的引用是最终变量。如果您不重新分配Java 8,它将使它们最终有效。

将最终添加到:

final GridPane root = new GridPane();
final TextField usernameTextField = new TextField();
final TextField portTextField = new TextField();
final Button button = new Button("Login!");

关于java - Java:无法引用非最终变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36335501/

10-11 01:25