Что вызывает это ArrayIndexOutOfBoundsException? - PullRequest
0 голосов
/ 04 мая 2011

Я делаю игру судоку для 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);

Ответы [ 3 ]

8 голосов
/ 04 мая 2011

Просто предположение - индексы массива ноль . Если вам нужно 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 голос
/ 04 мая 2011

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

0 голосов
/ 04 мая 2011

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

...