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)