我制作了这个程序,在1到41之间产生6个随机数。在UI中我有6个文本字段和一个按钮。如果我按下按钮,则在文本字段中显示6个数字。按下按钮时,我有1个函数(theNumbers()),第一个函数生成一个带有数字1-41的ObservableList,第二个函数随机选择6个数字。
发生的问题是按下按钮几次之后会出现一个ArrayIndexOutofBound异常:-1抛出,通常在生成数字0之后(或之后几次)(有时甚至在列表中)一个IndexOutOfBoundsException:索引:4,大小:抛出异常4(该数字是随机的顺便说一句)。此外,它似乎能够产生两次相同的数字或者比41更大的数字。(见151)
这是我的代码:
第一个功能:
ObservableList<Integer> list1 = FXCollections.observableArrayList();
private void createList(ObservableList<Integer> list1) {
this.list1 = list1;
int numbers = 41;
for (int i = 1; i <= numbers; i++) {
list1.add(i);
}
}
第二功能:
private void theNumbers() {
createList(list1);
ObservableList<Integer> finalNums = FXCollections.observableArrayList();
try {
for (int i = 0; i < 6; i++) {
FXCollections.shuffle(list1);
int lucky = new Random().nextInt(list1.size());
finalNums.add(lucky);
list1.remove(list1.indexOf(lucky));
}
} catch (Exception ex) {
throw ex;
}
FXCollections.sort(finalNums);
textField1.setText(finalNums.get(0).toString());
textField2.setText(finalNums.get(1).toString());
textField3.setText(finalNums.get(2).toString());
textField4.setText(finalNums.get(3).toString());
textField5.setText(finalNums.get(4).toString());
textField6.setText(finalNums.get(5).toString());
list1.clear();
finalNums.clear();
}
为什么会这样做的任何线索?可能是我的宏碁Aspire One上网本弄乱了吗?据我所知,这些错误不应该发生。
答案 0 :(得分:1)
您的代码尝试在for构造的一次传递中删除两次完全相同的数字。例如,您无法从列表中多次删除数字“2”。 indexOf(2)
方法将返回-1,因为它无法在列表中找到值2。
因此,在尝试从那里删除之前,您可能会检查list1
中是否仍存在某个号码。
private void theNumbers() {
createList(list1);
ObservableList<Integer> finalNums = FXCollections.observableArrayList();
try {
for (int i = 0; i < 6; i++) {
FXCollections.shuffle(list1);
int lucky;
do
{
lucky= new Random().nextInt(list1.size());
}while(list1.indexOf(lucky) == -1);
finalNums.add(lucky);
list1.remove(list1.indexOf(lucky));
}
} catch (Exception ex) {
throw ex;
}
这应该可以解决你的问题。
答案 1 :(得分:0)
尝试使用
int lucky = new Random().nextInt(list1.size()-1);