0

在尝试调试代码一段时间后,我无法弄清楚为什么会发生此错误。

我的主要Activity有一个对话框,允许选择项目。这是它的代码。mSelectedItems 是ArrayListMain 类中的一个静态变量。

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)并找到每个用户选择的项目的索引,然后进行计算(此处不包含计算代码)。

有人可以解释为什么会发生这个错误吗?似乎每次都为 index 分配-1,但这仅在列表为空并且您尝试在其中查找项目的 indexOf 时发生。

4

6 回答 6

0

根据文档indexOf(object),如果列表不包含此元素,则该方法返回 -1。根据您的代码,您正在存储整数mSelectedItems并将其元素传递indexOf()ArrayList持有 String 的方法 .. 所以存在巨大的不匹配。

尝试这个 :-

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];

如果失败,请回复

于 2013-08-01T12:22:50.723 回答
0

看来您的代码实际上有两个问题:

您的第一个问题是在这一行:

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

将 <= 更改为 <,以便此行如下所示:

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

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

此外,更改此行:

 int index = playerNames.indexOf(i);

 int index = playerNames.indexOf(selectedPlayers.get(i));
于 2013-08-01T10:33:12.363 回答
0

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

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

于 2013-08-01T10:33:22.020 回答
0

Change it with:

for(int i =0; i<selectedPlayers.size(); i++) {
于 2013-08-01T10:34:00.070 回答
0

这个

int index = playerNames.indexOf(i);

给出 -1 as index,因为您正在搜索 inti中的ArrayList<String>.

现在当你打电话时:

int rating = playerRatings[index];

这里索引为-1,如果您尝试访问负索引,任何数组都会给出超出范围的错误。

所以改变:

int index = playerNames.indexOf(i);

至:

int index = playerNames.indexOf(selectedPlayers.get(i));
assert index >= 0 : "selected players must exist";
于 2013-08-01T10:36:48.940 回答
0

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

for(int i=0; i<selectedPlayers.size(); i++)
于 2013-08-01T10:37:06.013 回答