在尝试调试代码一段时间后,我还没能弄清楚为什么会出现这种错误。
我的主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 :(得分: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];
如果失败则回复