2013-08-01 48 views
0

經過一段時間嘗試調試代碼後,我一直無法弄清楚爲什麼會發生此錯誤。Android ArrayIndexOutofBounds錯誤

我的主Activity有一個對話框,允許選擇項目。 這是它的代碼。 mSelectedItems是Main類中的靜態ArrayList

public void onClick(DialogInterface dialog, int which, 
        boolean isChecked) { 
       if (isChecked) { 
        // If the user checked the item, add it to the selected items 
        mSelectedItems.add(which); 
       } 
       else if (mSelectedItems.contains(which)) { 
        // Else, if the item is already in the array, remove it 
        mSelectedItems.remove(Integer.valueOf(which)); 
       } 

      } 
     }) 

     // Set the action buttons 
     .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int id) { 

       Data d = new Data(); 
       d.setSelectedPlayers(mSelectedItems); 
       d.run(); 

      } 
     }) 
     .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       //CODE TO JUST CLOSE DIALOGBOX 

      } 
     }); 

     return builder.create(); 
    } 

在這個對話框中現在,對於「確認按鈕」 - 我嘗試從另一個類,確實爲在對話框中選擇的項目的一些計算調用一個方法。我通過將我主要活動中的mSelectedItems arrayList設置爲另一個類中的arrayList字段(現在將其稱爲Data類)來完成此操作。下面是相關的代碼塊吧:

private ArrayList<String> playerNames = new ArrayList<String>(Arrays.asList("Messi", "Ronaldo", "Turan", "Drogba","Kuyt")); 

private int[] playerRatings = {87, 78, 66, 69, 86}; 

    private ArrayList selectedPlayers; 

     public void setSelectedPlayers(ArrayList mSelectedItems) { 
      this.selectedPlayers = mSelectedItems; 
     } 

     public int run() { 
      int totalScore = 0; 
      for(Object player: selectedPlayers) { 

       int index = playerNames.indexOf(player); 
       int rating = playerRatings[index]; 
       int[] playersActionSet = actionMatrix[index]; 

調試告訴我,出界失誤是INT指標線。此代碼塊需要迭代selectedPlayers(將從另一個類的對話框中分配給mSelectedPlayers),並查找每個用戶所選項目的索引,然後進行計算(計算代碼不包括在此處)。

有人可以解釋爲什麼這個錯誤發生?似乎索引每次都被賦值爲-1,但是隻有當列表爲空並且您試圖在其中查找indexOf項時纔會發生。

回答

0

看來你確實有在你的代碼的兩個問題:

你的第一個問題是在這一行:

for(int i =0; i<=selectedPlayers.size(); i++) { 

更改< =到<,使該行的內容如下:

for(int i =0; i<selectedPlayers.size(); i++) { 

索引從0開始,而尺寸()從1開始

此外,改變這一行:

int index = playerNames.indexOf(i); 

int index = playerNames.indexOf(selectedPlayers.get(i)); 
0

變化 for(int i =0; i<=selectedPlayers.size(); i++)

if(selectedPlayers.size()!=0){ for(int i =0; i<=selectedPlayers.size()-1; i++) {}}

+0

這仍然給出了錯誤。問題是selectdPlayers列表是空的。但我收到了同樣的錯誤。 – newenthusiast

0

與更改:

for(int i =0; i<selectedPlayers.size(); i++) { 
0

int index = playerNames.indexOf(i); 

是給-1作爲index,因爲你是在ArrayList<String>尋找一個int i

現在,當你撥打:

int rating = playerRatings[index]; 

這裏指數爲-1,任何陣列會發出bounds`錯誤,如果您嘗試訪問負指數。

因此改變:

int index = playerNames.indexOf(i); 

到:

int index = playerNames.indexOf(selectedPlayers.get(i)); 
assert index >= 0 : "selected players must exist"; 
+0

我將for循環更改爲(Object i:selectedPlayers)和int index = playerNames.indexOf(player)。 但我仍然得到同樣的錯誤。返回的索引是-1,這意味着selectedPlayers列表爲空。我不知道爲什麼,因爲我在調試器模式下在手機上手動選擇播放器,並且它仍然停留在int索引行,但仍然是ArrayOutOfBound異常。 – newenthusiast

+0

@IsraShabir很好。 –

0

您已超出您的列表的最大指數,我認爲你應該更新你的循環是:

for(int i=0; i<selectedPlayers.size(); i++) 
0

按照docindexOf(object)方法返回-1如果li st不包含這個元素。 根據你的代碼你正在存儲整數mSelectedItems並將其元素傳遞給indexOf()方法到一個ArrayList它持有的字符串..所以這是一個巨大的不匹配。

試試這個: -

private ArrayList<String> playerNames = new ArrayList<String>(Arrays.asList("Messi", "Ronaldo", "Turan", "Drogba","Kuyt")); 

private int[] playerRatings = {87, 78, 66, 69, 86}; 

    private ArrayList selectedPlayers; 

     public void setSelectedPlayers(ArrayList mSelectedItems) { 
      this.selectedPlayers = mSelectedItems; 
     } 

     public int run() { 
      int totalScore = 0; 
      for(Object player: selectedPlayers) { 

       int index = (Integer)player; //casting to Integer .....this should work 
       int rating = playerRatings[index]; 
       int[] playersActionSet = actionMatrix[index]; 

迴應,如果失敗