Java 为什么不是';"<;=1“;按预期工作?

Java 为什么不是';"<;=1“;按预期工作?,java,bukkit,Java,Bukkit,我有以下代码 @EventHandler public void onPlayerQuit(PlayerQuitEvent event){ Player player = event.getPlayer(); final Player[] playerlist = getServer().getOnlinePlayers(); if (playerlist.length <=1) { // if no players are online getSe

我有以下代码

@EventHandler
public void onPlayerQuit(PlayerQuitEvent event){
    Player player = event.getPlayer();
    final Player[] playerlist = getServer().getOnlinePlayers();
    if (playerlist.length <=1) { // if no players are online
        getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
            // this is a scheduler.
            public void run(){
                 if(playerlist.length <=1){
                     getServer().shutdown();
                 }
            }
        }, 6000L); // runs every 6000 ticks, which is every 300 seconds, which is every 5 minutes.
 }
}
@EventHandler
PlayerQuit(PlayerQuit事件)上的公共无效{
Player=event.getPlayer();
最终玩家[]玩家列表=getServer().GetOnlinePlayer();

如果(playerlist.length当有人重新登录时,您永远不会取消任务。因为您永远不会取消任务,即使有人在5米的时间范围内重新登录,它也会执行。

您编写的内容不起作用的原因是您使用了
我不知道您是否已经解决了此问题,但我认为部分问题是您正在尝试重新初始化一个已经初始化的最终变量…同样,与回复中的其他一些变量一样,我不知道Bukkit API,因为我正在尝试学习它,但您无法重新初始化最终变量…因此我建议删除最终部分,或者如果它必须保留,我将为run()创建一个新数组方法…当您第二次检查是否有人在线时…如果您更改数组,这将无关紧要,因为您可能正在更改在线的玩家数量…因为它是最终的,当您重新运行playerlist的最终数组长度时,它将始终为1…

您的代码不会刷新
玩家列表
变量,当延迟的任务运行时,从不检测任务实际运行时是否有人加入

更好地实施该准则的方法是:

@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
    Player player = event.getPlayer();
    boolean playersOnServer = false;
    for(Player p : getServer().getOnlinePlayers()) {
        if(p==player) continue;
        playersOnServer = true;
        break;
    }
    if (!playersOnServer) {
        getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
            public void run(){
                //Redo players check
                boolean playersOnServer = false;
                for(Player p : getServer().getOnlinePlayers()) {
                    playersOnServer = true;
                    break;
                }
                if(!playersOnServer){
                    getServer().shutdown();
                }
            }
        }, 6000L);
    }
}
在上面的代码中,我使用了for循环而不是简单的检查来查看是否有玩家在线,以使其能够使用旧bukkit中的旧玩家数组和新bukkit中的新集合方法

这种检测仍然存在缺陷,例如,如果最后一个人退出,然后直接加入,然后在再次离开之前等待4分59秒,那么当他离开时,它将直接关闭服务器

 @EventHandler
public void onPlayerQuit(PlayerQuitEvent event){
    Player player = event.getPlayer();
    final Player[] playerlist = getServer().getOnlinePlayers();
    if (playerlist.length <=1) { // if no players are online
        getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
            // this is a scheduler.
            public void run(){
                final Player[] playerlist = getServer().getOnlinePlayers(); 
                if(playerlist.length <=1){
                     getServer().shutdown();
                 }
            }
        }, 500L); // runs every 6000 ticks, which is every 300 seconds, which is every 5 minutes.
 }
}
if (playerlist.length == 0) { // if no players are online
    // Do stuff
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
    Player player = event.getPlayer();
    boolean playersOnServer = false;
    for(Player p : getServer().getOnlinePlayers()) {
        if(p==player) continue;
        playersOnServer = true;
        break;
    }
    if (!playersOnServer) {
        getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
            public void run(){
                //Redo players check
                boolean playersOnServer = false;
                for(Player p : getServer().getOnlinePlayers()) {
                    playersOnServer = true;
                    break;
                }
                if(!playersOnServer){
                    getServer().shutdown();
                }
            }
        }, 6000L);
    }
}