有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java IDE没有给出错误,但ArrayList无法工作

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

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

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

`   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中删除)

为什么会这样

是问题吗


共 (1) 个答案

  1. # 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
    

    诚然,无论如何我都会尽量避免使用静态变量,但那是另一回事