title: Local variable access to inner class needs to be declared final
body: <p>I got a problem of local variable access to inner class need to be declared final. It is from method createGrids() -> "<code>squares[i][j] = 0;</code>" that i is a local variable that need to be declared final. I don't know why and I have added final in fields but it is not working as well.</p>
  
  <pre><code>import java.util.ArrayList;
  import java.util.Random;
  </code></pre>
  
  <p>//omitted </p>
  
  <pre><code>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&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;();
  
      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 &lt; GRID_WIDTH; i++) {
              for(int j = 0; j &lt; GRID_HEIGHT; j++) {
                  squares[i][j] = 0;
              }
          }
      }
      public void setRandom()
      {
          Random r = new Random();
          for(int x = 0; x &lt; 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 &lt; GRID_WIDTH; i++) {
              for(int j = 0; j &lt; 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); 
      } 
  }
  </code></pre>