-1

我制作了这个程序,它产生 6 个介于 1 和 41 之间的随机数。在 UI 中,我有 6 个文本字段和一个按钮。如果我按下按钮,则 6 个数字将显示在文本字段中。按下按钮时,我触发了 1 个函数(theNumbers()),第一个函数创建了一个带有数字 1-41 的 ObservableList,第二个函数随机选择了 6 个数字。

发生的问题是,在按下按钮几次后,会抛出 ArrayIndexOutofBound Exception: -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();
}

任何线索为什么它会这样做?会不会是我的 Acer Aspire One 上网本搞砸了?据我所知,这些错误不应该发生。

4

2 回答 2

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

那应该可以解决您的问题。

于 2013-11-10T15:02:24.350 回答
0

尝试使用

int lucky = new Random().nextInt(list1.size()-1);
于 2013-11-09T22:18:39.077 回答