我是Java的新手,我在代码中遇到“错误”,无法理解/修复。为了给您一些背景知识,我设置了一个枚举来说明所有游戏状态(如下)

public enum GameState {

    IN_LOBBY(true), IN_GAME(false), POST_GAME(false), RESETTING(false);

    private boolean canJoin;
    private static GameState currentState;

    GameState(boolean canJoin) {
        this.canJoin = canJoin;
    }

    public boolean canJoin() {
        return canJoin();
    }

    public static void setState(GameState state) {
        GameState currentState = state;
    }

    public static boolean isState(GameState state) {
        return GameState.currentState == state;
    }

    public static GameState getState() {
        return currentState;
    }
}


在我的main.java类中,我在onEnable方法中指定将GameState设置为IN_LOBBY

基本上我想做的是在BlockBreakEvent Listener中,我想说的是

if (GameState.isState(GameState.IN_LOBBY)) {
    Location bLoc = block.getLocation();
    ChatUtilties.errorPlayer("You may not break blocks at this time.", player);
    bLoc.getBlock().setType(Material.type);
}


换句话说,我正在尝试检测GameState是否为IN_LOBBY,如果是,则进行设置,以使玩家无法打破障碍。但是目前出现了两个问题。


由于某些原因,当GameState为IN_LOBBY时,该插件甚至不会引起注意。它只是忽略了if语句。它甚至不会发送消息,就好像游戏状态不是IN_LOBBY一样。
我不确定如何根据玩家打破的障碍来动态更改材质。

最佳答案

您的安装程序有误:

public static void setState(GameState state) {
    GameState currentState = state;
}


您将在此处创建新的局部变量currentState,而不是使用现有字段。发生这种情况是因为您在变量类型的前面编写了变量类型,从而创建了新的初始化语句。

而是使用:

public static void setState(GameState state) {
    currentState = state;
}


(由于currentState是静态字段GameState.currentState = state;在这种情况下也可以使用)

编辑:

另一个问题与您的canJoin方法有关。

public boolean canJoin() {
    return canJoin();
}


此方法无条件地递归调用自身。因此,如果您尝试调用它,将会得到一个StackOverflowException。

相反,您可能打算返回canJoin字段:

public boolean canJoin() {
    return canJoin;
}

10-08 01:12