obect没有得到认可的java

时间:2018-06-14 09:38:40

标签: java object

我目前遇到了问题。我在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();
    }
}

3 个答案:

答案 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);

播放器应该为空。