【问题标题】:OutOfBoundsException with JavaFXJavaFX 的 OutOfBoundsException
【发布时间】:2016-06-12 16:15:14
【问题描述】:

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

现在,我的问题是我有 7 个选择框,每天一个,我只需要一种方法来处理它们。每次用户从其中一个选择框中选择一个值时,它应该调用扫描所有 7 个选择框的值并更新相对 int 值的方法。我采用了这个解决方案,因为我只对 7 个选择框使用了一种方法,我不知道是哪一种调用了该方法。为此,我创建了一个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 的值,即 for 循环结束后 j 的值。
  • 这不是问题,但是如果在任何 if 语句之前将 (Integer) newValuearrayCB[j].getItems() 设置为变量,阅读代码会更容易

标签: java javafx indexoutofboundsexception


【解决方案1】:

j 似乎是一个字段。在这种情况下,当触发侦听器时,它包含最后分配给它的值,即arrayCB.length = arrayCB.length(= 第一个int,其中j &lt; 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 一开始可能不应该被声明为字段

【讨论】:

【解决方案2】:

检查arrayCB.lengtharrayDifficulties.length 是否相等,否则你会得到java.lang.ArrayIndexOutOfBoundsException。否则

编辑

你能否将索引 j 存储在 final 变量中并在更改的方法中使用它。可能随着时间变化监听器通知方法而增加。

【讨论】:

  • 是的,它们是相等的:String arrayDifficulties[] = new String[7]; ChoiceBox arrayCB[] = new ChoiceBox[7]; 实际上我使用 String 而不是 int,就像我之前所说的那样
  • 我不确定你的意思。我在 final int j 中更改了 int j 但它给了我错误,因为在 for(j = 0; j &lt; arrayCB.length; j++) 我正在为 final 变量赋值。这是我第一次使用 javafx,我发现了一些困难,这是最大的,我在过去几天尝试了很多可能的解决方案,但没有结果
  • @Angie 不,我的意思是这样。 for (j = 0; j &lt; arrayCB.length; j++) { final int index = j; 并在更改的方法中使用索引。让我知道它是否有效,否则我会尝试为您提供更多代码。
  • 非常感谢,它有效!现在你告诉它,你的解决方案对我来说很明显,因为我知道问题是 j 在 changed 方法中修改了他的值,但我没有考虑以这种方式使用 final 变量。感谢您的帮助!
  • 很高兴它帮助了你。
猜你喜欢
  • 2015-09-08
  • 2012-01-01
  • 2015-09-05
  • 2012-02-25
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多