我的代码有问题。我正在编写一个程序,必须管理每周的深蹲训练。可以记录以前的培训或安排一整周的时间。在第二种情况下,用户每天必须输入下蹲次数和他认为会遇到的困难。我用一个具有3种声音(简单,中等,困难)的选择框来管理每天的困难,当我读取所选的值时,我将其保存为int值,以便轻松地将其用于程序中的其他内容(easy = 1,中= 2,硬= 3)。

现在,我的问题是我每天有7个ChoiceBox,而我只需要一种方法即可处理它们。每次用户从这些choiceBox之一中选择一个值时,它都应调用扫描所有7 choiceBox的值并更新相对int值的方法。我采用此解决方案是因为我仅对7 choiceBox使用一种方法,但我不知道哪个调用该方法。为此,我创建了一个choiceBox的向量,并使用了一个从0到
这里是异常和我的方法:

线程“ JavaFX应用程序线程”中的异常java.lang.ArrayIndexOutOfBoundsException:7

public void weekDifficulties() {

    for (j = 0; j < arrayCB.length; j++) {

        arrayCB[j].getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue ov, Number oldValue, Number newValue) {

                if ((Integer) newValue >= 0 && (arrayCB[j].getItems().get((Integer) newValue).equals("Easy")))
                    arrayDifficulties[j] = "1";
                else if ((Integer) newValue >= 0 && (arrayCB[j].getItems().get((Integer) newValue).equals("Medium")))
                    arrayDifficulties[j] = "2";
                else if ((Integer) newValue >= 0 && (arrayCB[j].getItems().get((Integer) newValue).equals("Hard")))
                    arrayDifficulties[j] = "3";
            }
        });
    }
}


感谢您的帮助

最佳答案

j似乎是一个字段。在那种情况下,当侦听器被触发时,它包含最后分配给它的值,即arrayCB.length = arrayCB.length(=第一个int,其中j < arrayCB.length产生false)。这当然会导致ArrayIndexOutOfBoundsException

由于显然在执行循环主体时需要访问j字段的值,因此需要将其复制到变量中:

for (j = 0; j < arrayCB.length; j++) {
     final int index = j;

    arrayCB[j].getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue ov, Number oldValue, Number newValue) {

            if ((Integer) newValue >= 0 && (arrayCB[index].getItems().get((Integer) newValue).equals("Easy")))
                arrayDifficulties[index] = "1";
            ...
        }
    });
}


此外,j可能首先不应声明为字段

关于java - JavaFX的OutOfBoundsException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37776454/

10-11 00:24