-1

1 から 41 までの 6 つの乱数を生成するこのプログラムを作成しました。UI には 6 つのテキストフィールドとボタンがあります。ボタンを押すと、テキストフィールドに6つの数字が表示されます。ボタンが押されたときに1つの関数(theNumbers())が起動され、最初の関数は1〜41の数字でObservableListを作成し、2番目の関数は6つの数字をランダムに選択します。

発生する問題は、ボタンを数回押した後に ArrayIndexOutofBound Exception: -1 がスローされることです。通常、数値 0 が生成された後 (または数回後) に (リストにもありません)、IndexOutOfBoundsException が発生することもあります。インデックス: 4、サイズ: 4 例外がスローされます (数値はランダムです)。また、同じ数を 2 回生成したり、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);
    }
}

2 番目の関数:

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 コンストラクトの 1 回のパスでまったく同じ数を 2 回以上削除しようとしています。たとえば、リストから番号「2」を複数回削除することはできません。indexOf(2)リストに値 2 が見つからないため、メソッドは -1 を返します。

したがって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 に答える