我有2个需要访问同一数组的按钮,并且给出了错误封闭范围内定义的局部变量 newCards 必须是final或有效的final。
我在做错什么事吗,即违反Java规则?
这是我到目前为止编写的代码:
final ArrayList<Integer> newDeck = new ArrayList<Integer>();
ShuffleFunctions.shuffleDeck(newDeck);
int number = Integer.parseInt(cardNbr.getText());
ArrayList<Integer> newCards = new ArrayList<Integer>();
newCards = ShuffleFunctions.randomCardsSelector(number, newDeck);
submitBtn.setOnAction(e->{
fetchBtn.setDisable(false);
submitBtn.setDisable(true);
for(int i = 0; i<number; i++) {
int x = newCards.get(i);
String url = new String("bin/"+ x +".png");
File file1 = new File(url);
Image image1 = new Image(file1.toURI().toString());
ImageView imageView = new ImageView(image1);
imageView.setFitHeight(90);
imageView.setFitWidth(90);
drawnCards.getChildren().add(imageView);
}
});
fetchBtn.setOnAction(e->{
fetchBtn.setDisable(true);
ArrayList<Integer> selectedNewCard= new ArrayList<Integer>();
selectedNewCard = ShuffleFunctions.randomCardsSelector(1, newDeck);
int s = selectedNewCard.get(0);
String url = new String("bin/" + s + ".png");
File file2 = new File(url);
Image img = new Image(file2.toURI().toString());
drawnCard.setImage(img);
drawnCard.setFitHeight(150);
drawnCard.setFitWidth(150);
});
drawCardBtn.setOnAction(e->{
drawCardBtn.setDisable(false);
ArrayList<Integer> oneCard = new ArrayList<Integer>();
oneCard = ShuffleFunctions.randomCardsSelector(1,newCards);
String url = new String("bin/" /*x*/ + ".png");
File file3 = new File(url);
Image image = new Image(file3.toURI().toString());
drawnCard.setImage(image);
drawnCards.getChildren().get(0).setStyle("-fx-opacity: 0.5");
});
答案 0 :(得分:1)
JAVA中的lambda函数不允许这样做。
问题是,您正在多个lambda函数中使用一个变量,该变量将在将来的某个时间点执行,并且无法预先确定。
为了防止这种未知行为,JAVA强制将局部变量设置为 final ,以使它们的状态不会改变并且我们(代码)可以具有可预测的行为。
解决此问题的唯一方法是将变量设置为 final 。