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



        }
  }

ActionListener で使用する前に、 correctScore 変数を final として宣言する必要があるというエラーが表示されます。しかし、正しいスコアを最終的に設定すると、他のあらゆる種類のエラーが発生します。誰でもこれを解決する方法を考えることができますか?

4

3 に答える 3

3

ローカル変数を匿名クラスに渡すには、Java 言語の一部である final でなければなりません。プリミティブ変数が final の場合、それを変更することはできないため、final を作成するときに問題が発生しますcorrectScore

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 スコアが final であると宣言したため、そのメッセージが表示されます。非最終変数を使用して最終変数の値を設定することはできません。スコアをファイナルにしたい理由がわかりません。その決勝戦を削除するだけです。

編集:最初の読み取りで、 correctScore が関数変数であることを見逃しました。クラス変数にすると、多くの問題が解消されると思います。

于 2012-07-09T21:34:33.093 に答える