2016-06-12 39 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