2011-05-04 218 views
0

我正在爲Android做一個數獨遊戲,但我遇到了問題。遊戲編譯,但一旦你到達遊戲屏幕並按下按鈕,遊戲就會崩潰。導致此ArrayIndexOutOfBoundsException的原因是什麼?

我檢查了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); 
+0

我們錯過了兩件重要的事情 - 按鈕陣列的大小和usequare的大小是什麼? – MByD 2011-05-04 09:19:19

回答

8

只是一個猜測 - 數組索引是零基於。如果你需要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]當您創建陣列將definitly創建ArrayIndexOutOfBoundsException

+0

你在哪裏建議我把這個功能放在我的文件中? – rich 2011-05-04 09:59:17

+0

@rich - errr - 第二個片段是源代碼中的更正副本,只需將其粘貼回代碼('findScreenV'方法)即可。 – 2011-05-04 10:01:32

0

在Java中,當時u需要給該數組的大小固定。按鈕[]按鈕=新按鈕[9],然後創建該數組的對象,如按鈕[0] = findViewById(R.id.button_1); 其他明智的使用arrayList作爲最佳解決方案。

1

如果數組的長度爲9,則表示您可以將arr [0]返回到arr [8],如果嘗試檢索不存在的arr [9],將會得到ArrayIndexOutOfBoundsException。

相關問題