【问题标题】:IDE gives no errors, but ArrayList fails to workIDE 没有给出错误,但 ArrayList 无法工作
【发布时间】:2013-06-22 11:14:20
【问题描述】:

我在包com.mcvigor 中名为RuneCraft 的主类中有这个:

public static ArrayList<String> prospPlayers = new ArrayList<String>();

我在包com.mcvigor.listeners 中另一个名为MiningListener 的类中有这个:

`   public void playerRClickOre(PlayerInteractEvent event) { //Ore Interactions

    final Player p = event.getPlayer();

    if(event.getPlayer().isOp()) return;

    if(RuneCraft.prospPlayers.contains(p.getName())) return;

    if(isClickedBlockMineral(event) && event.getAction() == Action.LEFT_CLICK_BLOCK && !hasPickaxe(p)) { //block is mineral, player left clicked it, no pickaxe
        p.sendMessage(ChatColor.DARK_RED + "You need a pickaxe to mine this."); // ADD CHECKS FOR PICKAXE REQUIRED LEVEL 2 USE
    }

    if(isClickedBlockMineral(event) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {

        switch(event.getClickedBlock().getType()) {

        case CLAY: //clay
            RuneCraft.prospPlayers.add(p.getName());
            p.sendMessage(ChatColor.DARK_RED + "You examine the rock for ores...");
            Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){
                public void run() {
                    p.sendMessage(ChatColor.GRAY + "This rock contains" + ChatColor.DARK_RED + " clay" + ChatColor.GRAY + ".");
                }
            }, 3*20L); // TODO: Change time
            RuneCraft.prospPlayers.remove(p.getName());
            break;`

下面还有其他内容,但这并不重要。问题是当我勘探或检查矿石的岩石时,它应该将我添加到列表中,如果我再次尝试这样做,它不会让我直到我完成勘探(它从 ArrayList 中删除我的名字) .

为什么会这样?

if(RuneCraft.prospPlayers.contains(p.getName())) return; 有问题吗?

【问题讨论】:

    标签: java arrays list arraylist bukkit


    【解决方案1】:

    看看这段代码:

    RuneCraft.prospPlayers.add(p.getName());
    p.sendMessage(ChatColor.DARK_RED + "You examine the rock for ores...");
    Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){
        public void run() {
            p.sendMessage(ChatColor.GRAY + "This rock contains" + ChatColor.DARK_RED + " clay" + ChatColor.GRAY + ".");
        }
    }, 3*20L); // TODO: Change time
    RuneCraft.prospPlayers.remove(p.getName());
    

    在您添加名称并表示您已经开始检查它之后,您将再次立即删除该名称。您只想在完成检查后删除它,对吗?因此,您需要将remove 调用移动到“稍后的任务”执行时发生:

    RuneCraft.prospPlayers.add(p.getName());
    p.sendMessage(ChatColor.DARK_RED + "You examine the rock for ores...");
    Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
        public void run() {
            p.sendMessage(ChatColor.GRAY + "This rock contains" + 
                          ChatColor.DARK_RED + " clay" + ChatColor.GRAY + ".");
            RuneCraft.prospPlayers.remove(p.getName());
        }
    }, 3*20L); // TODO: Change time
    

    诚然,我会尽量避免为此使用静态变量,但那是另一回事。

    【讨论】:

    • 哦,哇,多么愚蠢的错误!感谢您的回答,我认为只有在“运行”实际完成后才会执行 public void run 下的代码。另外,如果您不介意,为什么要避免为此使用静态变量?
    • @user2510422:一般来说,静态变量代表全局状态——对于常量来说并不算太糟糕,但是可变全局状态使得推理和测试代码变得更加困难。跨度>
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2021-04-14
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多