ObservableList产生错误

时间:2013-11-09 22:15:48

标签: javafx-2

我制作了这个程序,在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上网本弄乱了吗?据我所知,这些错误不应该发生。

2 个答案:

答案 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);