Что вызывает это исключение ArrayIndexOutOfBoundsException?

#java #android #indexoutofboundsexception

#java #Android #исключение indexoutofboundsexception

Вопрос:

Я создаю игру судоку для Android, но у меня возникла проблема. Игра компилируется, но как только вы попадаете на экран игры и нажимаете кнопку, игра вылетает.

Я проверил logcat, и, похоже, это ошибки:

 05-04 09:07:41.620: ERROR/AndroidRuntime(325): FATAL EXCEPTION: main
05-04 09:07:41.620: ERROR/AndroidRuntime(325): java.lang.ArrayIndexOutOfBoundsException
05-04 09:07:41.620: ERROR/AndroidRuntime(325):     at org.example.fpsudoku.Button.findScreenV(Button.java:59)
05-04 09:07:41.620: ERROR/AndroidRuntime(325):     at org.example.fpsudoku.Button.onCreate(Button.java:38)
05-04 09:07:41.620: ERROR/AndroidRuntime(325):     at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
05-04 09:07:41.620: ERROR/AndroidRuntime(325):     at android.app.Dialog.show(Dialog.java:225)
05-04 09:07:41.620: ERROR/AndroidRuntime(325):     at org.example.fpsudoku.Game.showButtonOrError(Game.java:181)
05-04 09:07:41.620: ERROR/AndroidRuntime(325):     at org.example.fpsudoku.SudokuScreen.onTouchEvent(SudokuScreen.java:221)
05-04 09:07:41.620: ERROR/AndroidRuntime(325):     at android.view.View.dispatchTouchEvent(View.java:3766)
  

и это код, который, похоже, является проблемой:

     findScreenV();

    for (int element : usesquare)
    {
        if (element != 0)
            buttons[element - 1].setVisibility(View.INVISIBLE);
    }
    setListeners();
}

private void findScreenV()
{
    button = findViewById(R.id.button);
    buttons[1] = findViewById(R.id.button_1);
    buttons[2] = findViewById(R.id.button_2);
    buttons[3] = findViewById(R.id.button_3);
    buttons[4] = findViewById(R.id.button_4);
    buttons[5] = findViewById(R.id.button_5);
    buttons[6] = findViewById(R.id.button_6);
    buttons[7] = findViewById(R.id.button_7);
    buttons[8] = findViewById(R.id.button_8);
    buttons[9] = findViewById(R.id.button_9);
  

Комментарии:

1. Мы упускаем две важные вещи — каков размер массива buttons и каков размер usesquare?

Ответ №1:

Просто предположение — индексы массива основаны на нуле. Если вам нужно 9 кнопок, вы сделаете

 Button[] buttons = new Button[9];
  

для создания массива и

 button = findViewById(R.id.button);
buttons[0] = findViewById(R.id.button_1);
buttons[1] = findViewById(R.id.button_2);
buttons[2] = findViewById(R.id.button_3);
buttons[3] = findViewById(R.id.button_4);
buttons[4] = findViewById(R.id.button_5);
buttons[5] = findViewById(R.id.button_6);
buttons[6] = findViewById(R.id.button_7);
buttons[7] = findViewById(R.id.button_8);
buttons[8] = findViewById(R.id.button_9);
  

чтобы заполнить его. Обращение buttons[9] в моем примере определенно создаст ArrayIndexOutOfBoundsException

Комментарии:

1. куда вы предлагаете поместить эту функцию в моем файле?

2. @rich — ошибка — второй фрагмент является исправленной копией из вашего исходного кода, просто вставьте его обратно в свой код ( findScreenV метод).

Ответ №2:

если массив имеет длину 9, это означает, что вы можете повторно преобразовать arr[0] в arr[8], если вы попытаетесь извлечь arr[9], которого там нет, вы получите исключение ArrayIndexOutOfBoundsException.

Ответ №3:

В Java при создании массива в это время вам нужно указать фиксированный размер этого массива. например, Button[] кнопки = новая кнопка [9], а затем создайте объект из этого массива, например buttons[0] = findViewById(R.id.button_1); В противном случае используйте ArrayList как лучшее решение.