Android ArrayIndexOutofBounds错误

时间:2013-08-01 10:29:41

标签: android indexoutofboundsexception

在尝试调试代码一段时间后,我还没能弄清楚为什么会出现这种错误。

我的主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时才会发生这种情况。

6 个答案:

答案 0 :(得分:0)

您的代码中似乎确实存在两个问题:

你的第一个问题就在这一行:

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

将&lt; =更改为&lt;,以便此行如下所示:

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

索引从0开始,而size()从1开始。

此外,更改此行:

 int index = playerNames.indexOf(i);

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

更改为:

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

答案 3 :(得分:0)

int index = playerNames.indexOf(i);

将-1设为index,因为您正在i中搜索int ArrayList<String>

现在打电话的时候:

int rating = playerRatings[index];

这里索引是-1,如果你试图访问负索引,任何数组都会给出out ofs。错误。

所以改变:

int index = playerNames.indexOf(i);

为:

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

答案 4 :(得分:0)

您超出了列表的最大索引,我认为您应该将for循环更新为:

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

答案 5 :(得分:0)

根据doc indexOf(object)方法返回-1,如果列表不包含此元素。 根据你的代码,你在mSelectedItems中存储整数,并将其元素传递给indexOf()方法到一个持有String的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];

如果失败则回复