Variable locale de l'accès à l'intérieur de la classe doit être déclarée final
J'ai eu un problème de variable locale de l'accès à l'intérieur de la classe doivent être déclarées final. C'est à partir de la méthode createGrids() -> "squares[i][j] = 0;
" que j'ai est une variable locale qui doivent être déclarés final. Je ne sais pas pourquoi et j'ai ajouté finale dans les champs, mais il ne fonctionne pas aussi bien.
import java.util.ArrayList;
import java.util.Random;
//omis
public class Minesweeper{
private JFrame frame;
private int cols = 9;
private int rows = 9;
public static final int GRID_HEIGHT = 9;
public static final int GRID_WIDTH = 9;
final JButton[][] grids = new JButton[GRID_WIDTH][GRID_HEIGHT];
final int [][] squares = new int [GRID_WIDTH][GRID_HEIGHT];
private static int width = 500;
private static int heigth = 400;
private JPanel s;
private JPanel n;
private JPanel w;
private int mines = 10;
private int bomb = 1;
private JLabel j1;
private JPanel e;
private JRadioButton moreGrid;
ArrayList<Integer> list = new ArrayList<Integer>();
public Minesweeper() {
mines=10;
createGrids();
s = new JPanel();
n = new JPanel();
e = new JPanel();
w = new JPanel();
resetButton = new JButton("Rest");
resetButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){ createGrids();}
});
newGameButton = new JButton("New Game");
frame.add(n, BorderLayout.NORTH);
frame.add(w, BorderLayout.WEST);
frame.add(s, BorderLayout.SOUTH);
s.add(resetButton);
s.add(newGameButton);
}
public void game()
{
for(int i = 0; i < GRID_WIDTH; i++) {
for(int j = 0; j < GRID_HEIGHT; j++) {
squares[i][j] = 0;
}
}
}
public void setRandom()
{
Random r = new Random();
for(int x = 0; x < mines; x++){
int b = r.nextInt(9);
int c = r.nextInt(9) ;
squares[b][c] = bomb;
}
}
public void createGrids(){
frame = new JFrame("Minesweeper");
createMenuBar(frame);
frame.setTitle("Nicholas Minesweeper");
JPanel m = new JPanel(new GridLayout(9,9));
for(int i = 0; i < GRID_WIDTH; i++) {
for(int j = 0; j < GRID_HEIGHT; j++) {
grids[i][j] = new JButton();
grids[i][j].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if (squares[i][j] == 1)
{
System.out.println("BOmb");
}
else {
grids[i][j].setVisible(false);
}
}
});
m.add(grids[i][j]);
}
}
frame.add(m, BorderLayout.CENTER);
frame.setResizable(false);
frame.setSize(width, heigth);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(350, 250);
frame.setVisible(true);
}
}
Double Possible de la Variable est accessible à l'intérieur de intérieur de la classe. Doit être déclarée final
OriginalL'auteur yoadle | 2014-12-19
Vous devez vous connecter pour publier un commentaire.
Anonyme intérieure classes ont accès aux variables locales par le biais d'un tour derrière les coulisses. Variable locale sont mis en œuvre comme aux variables membres cachés de l'intérieur de la classe. Ils sont affectés à des copies de la variable locale. Pour empêcher la copie de la valeur à partir d'une erreur, le compilateur Java impose que ces variables locales doivent être
final
de sorte qu'ils ne sont pas modifiées, de sorte que l'exemplaire reste correct.Les champs de la classe englobante n'avez pas besoin d'être
final
; les variables locales utilisées doivent êtrefinal
. Vous devez faire toutes les variables locales utilisées dans votre anonyme intérieur de la classefinal
. Vous pouvez le faire en déclarantfinal
variables soient initialisées à votrei
etj
valeurs, et de les utiliser dans votre anonyme intérieur de la classe.Noter que dans Java 8, ce ne serait pas nécessaire, parce que le Java 8 compilateur de détecter si les variables locales utilisées dans les classes internes anonymes sont "effectivement finale", c'est pas
final
mais n'a jamais changé une fois initialisée.OriginalL'auteur rgettman
Ce qui se passe, c'est que vous êtes la création de 81 ActionListener classes, chacune avec ses propres
actionPerformed
méthode. Mais lorsque cette méthode est exécutée, la classe ne sait pas ce que la valeur dei
etj
est plus, car elle a laissé loin derrière.Java empêche que cela se produise, d'où l'erreur du compilateur. Il nécessite référencé variables locales final afin qu'il puisse les transmettre à la création de classes.
La façon la plus simple de résoudre ce problème est de créer une paire de
final
variables à l'intérieur de votre boucles:OriginalL'auteur Michael Myers