0

I'm new to android studio and making a test project "Tic Tac Toe". I'm getting this error of "array index out of bounds". The code is huge so I just pasted the functions where it's throwing exception. I'm using two arrays, arr[] is the state of current game and ArrayList is holding all the indexes of empty blocks. The length of array is 9. I don't know how the index is becoming 9?

int[] arr = {2, 2, 2, 2, 2, 2, 2, 2, 2}; // 2-Empty, 1-X, 0-O
int currPlayer = 0
ArrayList<Integer> emptyBlocksIndexes = new ArrayList<Integer>();

public void autoPlay() {
    boolean executed = false;

    for (int x=0; x<9; x++) {

        if (arr[x] != 2) {

            if (arr[x] == arr[x + 1] && arr[x + 2] == 2 && x != 2 && x != 5 && x != 8) {
                autoPlayPart(x + 2);
                executed = true;
                break;
            }
            else if (arr[x] == arr[x + 3] && arr[x + 6] == 2 && x < 6) {
                autoPlayPart(x + 6);
                executed = true;
                break;
            }
        }
    }
    if (!executed) {
        Random r = new Random();
        int randomValue = emptyBlocksIndexes.get(r.nextInt(emptyBlocksIndexes.size()));
        Log.i("SIZE ", String.valueOf(emptyBlocksIndexes.size()));

        autoPlayPart(randomValue);
    }

}

public void autoPlayPart(int arrIndex) {
    Log.i("INDEX ", String.valueOf(arrIndex));
    if (currPlayer == 0){
        arr[arrIndex] = 0;
        modifyScreen(arrIndex).setImageResource(R.drawable.o);
        currPlayer = 1;
        emptyBlocksIndexes.remove(Integer.valueOf(arrIndex));
    }
    else if (currPlayer == 1){
        arr[arrIndex] = 1;
        modifyScreen(arrIndex).setImageResource(R.drawable.x);
        currPlayer = 0;
        emptyBlocksIndexes.remove(Integer.valueOf(arrIndex));
    }
}

Error:

2021-04-12 06:37:06.487 20545-20545/com.thedevelopers.tictactoe E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.thedevelopers.tictactoe, PID: 20545
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
        at android.view.View.performClick(View.java:5632)
        at android.view.View$PerformClick.run(View.java:22312)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6246)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:869)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
        at android.view.View.performClick(View.java:5632) 
        at android.view.View$PerformClick.run(View.java:22312) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6246) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:869) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759) 
     Caused by: java.lang.ArrayIndexOutOfBoundsException: length=9; index=9
        at com.thedevelopers.tictactoe.MainActivity.autoPlay(MainActivity.java:163)
        at com.thedevelopers.tictactoe.MainActivity.onClick(MainActivity.java:108)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 
        at android.view.View.performClick(View.java:5632) 
        at android.view.View$PerformClick.run(View.java:22312) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6246) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:869) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759) 

1 Answers1

1

The size of the array equals to 9. You can access from index 0 to length of the array -1 (index 8).

nissim abehcera
  • 821
  • 6
  • 7