2016-06-12 45 views
1

我的代码存在问题。我正在编写一个必须管理每周下蹲训练的计划。有可能记录以前的培训或编程一整周。在第二种情况下,用户每天都必须输入蹲点的数量和他认为的难度。我用一个有三种声音(easy,medium,hard)的选择框来管理每天的难度,当我读取所选的值时,我将它保存为int以便在程序中轻松地使用它(easy = 1,medium = 2,hard = 3)。使用JavaFX发生OutOfBoundsException

现在,我的问题是,我有7个choiceBox,每天一个,我只需要一个方法来处理它们。每次用户从其中一个choiceBox中选择一个值时,它应该调用扫描所有7 choiceBox的值并更新相对的int值的方法。我采用了这个解决方案,因为我只使用一个方法来处理7 choiceBox,我不知道哪个方法叫做方法。要做到这一点,我创建了一个choiceBox的矢量,我使用了一个从0到< .length的cicle,但是每次我在任何选择框中选择一个声音时,cicle就会跳出界限。我也创建了一个int的相对数组来保存不同的困难。

这里的例外,我的方法:

异常在线程 “的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"; 
      } 
     }); 
    } 
} 

感谢您的帮助

+0

请指定抛出异常的确切行。另外 - 在哪里定义了“j”?如果它是一个类成员,那么所有的处理程序都会引用它,并且都将使用'arrayCB.length'的值,这是'j'在for循环结束后的值。 – Itai

+0

这不是问题,但如果在任何if语句之前将'(Integer)newValue'和'arrayCB [j] .getItems()'设置为变量,那么读取代码会更容易 –

回答

1

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可能不应该被宣布为字段

+0

也谢谢你,贝尼通的解决方案,我可以看到。我不知道你告诉我的监听器的工作方式:在这种情况下,当监听器被触发时,它包含最后分配给它的值,这就是为什么我无法让我对代码中的OutOfBounds有所了解的原因。非常感谢你! – Angie

+0

另请参见[访问Enclosing Scope的局部变量](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html#accessing)和[访问Enclosing Class的成员](https:/ /docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html#accessing-members-of-an-enclosing-class) – Itai

0

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

编辑

你可以存储在最后一个变量指标j和改变的方法使用它。可能它会随时间变化而增加Listener通知该方法。

+0

是的,它们相同: 'String arrayDifficulties [] = new String [7]; ChoiceBox arrayCB [] = new ChoiceBox [7]; '事实上,我使用字符串不int,因为我之前告诉 – Angie

+0

@Angie我已经更新了答案,你可以检查。 – Beniton

+0

我不确定明白你的意思。我在final int j中更改了int j,但之后它给了我一个错误,因为在'for(j = 0; j Angie