1

I am trying to create a Tic-Tac-Toe game in Java for one of my classes. The program takes an int from the command line and creates a JButton 2D array of that size. It also has an undo and a new game button. The program compiles and runs and when I click the new game button no exception occurs, but when I click on one of the game spaces, it throws this exception.

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2
    at GameTester.newMove(GameTester.java:28)
    at TicTacToe$GameListener.actionPerformed(TicTacToe.java:145)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:696)
    at java.awt.EventQueue$4.run(EventQueue.java:694)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

My newMove method simply takes the x and y locations of the button and the turn (1 or 2), and adds it to the 2D int array associated with the GameTester class.

public void newMove(int x, int y, int turn)
    {
    board[x][y] = turn;
}

This is part of the loop within my ActionListener that includes where the newMove method is called.

 if (event == buttons[x][y])
{
    theBoard.moveLog(x,y);
    theBoard.newMove(x,y,toggle);
    if (toggle == 1)
    {
        buttons[x][y].setText("X");
        toggle = 2;
    }
    else
    {
        buttons[x][y].setText("O");
        toggle = 1;
    }
            ..... 
    }

Any help is greatly appreciated! :)

4
  • You probably did not initialize board correctly. Please show us the code where it is initialized. Commented Nov 12, 2013 at 17:55
  • public class GameTester { private int[][] board; private int lastX; private int lastY; private int size; public GameTester(int x) { //initialize all to 0 size = x; board = new int[size][size]; for (int y = 0; y < size; y++) { for (int z = 0; z < size; z++) { board[y][z] = 0; } } } Commented Nov 12, 2013 at 17:57
  • x is the size of the game board that is entered from the command line. Commented Nov 12, 2013 at 17:58
  • @user2984357 ensure that (0 <= x <= size) and (0 <= y <= size) in the newMove method. It seems like your array size is 0 or 1 but x or y is 2. Commented Nov 12, 2013 at 18:04

1 Answer 1

3

From what you have provided the problem is likely that buttons and board are not arrays of the same dimensions. Try using variables to set both sizes or use one to set the other to be sure they are the same size.

Option 1

int X = 3, Y = 3;

JButton[][] buttons = new JButton[X][Y];
char[][] board = new char[X][Y];

Option 2

int X = 3, Y = 3;

JButton[][] buttons = new JButton[X][Y];
char[][] board = new char[buttons.length][buttons[0].length];

If this isn't the case then you'll need to provide a short, self-contained, compilable example of your problem so we can see what's going on.

Sign up to request clarification or add additional context in comments.

1 Comment

You're right. My code had gotten a little mixed up and I was trying to assign a number an uninitialized array. Thank you so much!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.