0

可能重复:
为什么在匿名类中只能访问最终变量?

这是我为班级创建的“随机数学游戏”的代码:

package RandomMathGame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class RandomMathGame {

    public static void main(String[] args) {
        RandomProblemGenerator randomProblems = new RandomProblemGenerator(10);
        final int numberProblems = 10;
        int correctScore = 0;
        JPanel panel = new JPanel();
       int answer;
        int correctAnswer;
        JLabel[] mathProblems = new JLabel[numberProblems];
        final JTextField[] mathAnswers = new JTextField[numberProblems];
        JLabel[] correctYesNo = new JLabel[numberProblems];
        final JLabel score = new JLabel(correctScore + "/10");
        JButton submit = new JButton("Submit");
        for (int i = 1; i <= numberProblems; i++)
        {
            final int X = randomProblems.createNumberX();
            final int Y = randomProblems.createNumberY();

            mathProblems[i] = new JLabel("" + X + " * " + Y + " = ");
            mathAnswers[i] = new JTextField();


             answer = Integer.parseInt(mathAnswers[i].getText());
             correctAnswer = X * Y;

            if (answer == correctAnswer)
            {
                correctYesNo[i] = new JLabel("Correct answer; good job!");
                correctScore = correctScore + 1;
            }
            else
            {
               correctYesNo[i] = new JLabel("Incorrect answer; try again!");

            }
             panel.add(mathProblems[i]);
             panel.add(mathAnswers[i]);
             panel.add(correctYesNo[i]);
            }
      submit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                score.setText("Score: " + correctScore + "/10");
            }
        });



        panel.add(submit);
        panel.add(score);

        JFrame gameFrame = new JFrame();
        gameFrame.setTitle("Random Math Game");
        gameFrame.setSize(150, 150);
        gameFrame.setVisible(true);
        gameFrame.setContentPane(panel);



        }
  }

我收到一个错误,必须将正确的分数变量声明为 final,然后 ActionListener 才能使用它。但是当我将correctScore设置为final时,它会导致各种其他错误。任何人都可以想办法解决这个问题吗?

4

3 回答 3

3

要将局部变量传递给匿名类,它必须是 final 的——这是 Java 语言的一部分。现在,当原始变量为 final 时,您无法修改它,因此在制作correctScorefinal 时会出现问题。

一种解决方法是在调用之前使用临时变量addActionListener

final int temp = correctScore;

并在您的方法中使用该temp变量。actionPerformed

请注意,当您这样做时,将来对 correctScore 所做的任何更改都不会反映在 temp 的值中。

于 2012-07-09T21:32:02.613 回答
0

在 Java 中,如果要从本地类(

new ActionListener() {
...
...
}

是一个新的本地匿名类)该变量必须声明为 final。

本地类不能访问没有final修饰符的封闭方法的局部变量,例如:

public class Main {
    private int b=5;
    public void bla() {
    int a = 5;
    ActionListener al = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            a = 4; // Error. a must be final
            b = 5; // OK!
        }
    };
  }
}

您的问题的一个可能解决方案是使用在任何方法之外声明的变量(上例中的 b )

于 2012-07-09T21:31:44.223 回答
-1

您收到该消息是因为您已宣布 JLabel 分数为最终分数。您不能使用非最终变量来设置最终变量的值。我不知道你为什么要打进决赛。只需删除该决赛。

编辑:我在第一次阅读时错过了 correctScore 是一个函数变量。如果您将其设为类变量,我认为您的许多问题都会消失。

于 2012-07-09T21:34:33.093 回答