我目前遇到了问题。我在Player player = players.get(0);
之前将obj播放器放了几行,但在下一行中它表示播放器尚未解析。有没有一种简单的方法来解决这个问题?
players.get(0)
不是空的,我使用System.out.println
对其进行了测试。
GameStoreProvider.getInstance().addObserver(gameState -> {
List<Player> players = gameState.getPlayers();
Player player = players.get(0);
});
for(int i = 1; i<300; i++) {
var action = new RandomCardAction(player);
try {
GameStoreProvider.sendAction(action);
} catch (RemoteException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
代码:
gameState -> {
List<Player> players = gameState.getPlayers();
Player player = players.get(0);
}
定义了一个匿名函数,它具有内部作用域。里面定义了什么 并不是外在的范围。
您可以在主范围内移动上面的变量定义,如下所示:
final Player player;
gameState -> {
List<Player> players = gameState.getPlayers();
player = players.get(0);
}
解决编译问题,或者你可以通过移动内部循环来完成与内部作用域内player
相关的所有工作(如@Arcturus所建议的那样)。
答案 1 :(得分:1)
因为玩家生活在lambda函数中。如果你给addObserver
一个lambda,你可以给addObserver
控制何时调用这个函数。它可以是直接的,但也可以超过10秒。同时,即使addObserver
尚未完成,您的其他代码仍然可以执行。这意味着当代码到达您的for循环时,播放器可以是null
您可能还希望在lambda中迁移第二部分:
GameStoreProvider.getInstance().addObserver(gameState -> {
List<Player> players = gameState.getPlayers();
Player player = players.get(0);
for(int i = 1; i<300; i++) {
var action = new RandomCardAction(player);
try {
GameStoreProvider.sendAction(action);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
答案 2 :(得分:0)
lambda表达式中定义的播放器是在lambda外部不可见的局部变量。检查一下
var action = new RandomCardAction(player);
播放器应该为空。