minecraft spigot / bukkit插件奇怪的nullPointer

时间:2016-03-08 18:57:06

标签: java minecraft bukkit

package me.psrcek.compassMenu.listeners;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

public class PlayerJoinListener implements Listener {

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        ItemStack[] inv = e.getPlayer().getInventory().getContents();

        for (ItemStack item : inv) {
            if (item == null) continue;

            if (item.getType().equals(Material.COMPASS)) {
                if (item.getItemMeta().getDisplayName() == null) continue;

                if (item.getItemMeta().getDisplayName().equals(ChatColor.RESET + "" + ChatColor.AQUA + "Menu")) {
                    e.getPlayer().sendMessage("found proppertly named compass");
                    return;
                }
            }
        }

        ItemStack compass = new ItemStack(Material.COMPASS);
        ItemMeta compassMeta = compass.getItemMeta();

        compassMeta.setDisplayName(ChatColor.RESET + "" + ChatColor.AQUA + "Menu");

        compass.setItemMeta(compassMeta);

        e.getPlayer().getInventory().addItem(compass);
        e.getPlayer().updateInventory();

    }

}

好吧所以我正在尝试创建某种菜单,我想确保所有玩家都有指南针加入,我不知道为什么这个代码不起作用,如果你有一个没有命名的指南针在你的库存中它只是没有给你指南针。 如果我没有检查那些== null我的代码给出了带有上述条件的nullPointerException。 这里有人看错吗? Eclipse没有错误。

3 个答案:

答案 0 :(得分:0)

我不知道为什么会这样,但改变

item.getType().equals(Material.COMPASS)

item.getType() == Material.COMPASS

让它发挥作用。我一直以为那些都是一样的。

答案 1 :(得分:0)

我看到了几个可能来自NullPointerException的地方。 首先,您检查的项目是否为null,如果是,则检查它是否为指南针。但如果它为空,它也不能成为指南针。试试这个:

if(item != null){
    if(item.getType() == Material.COMPASS){

    }
}

当你得到指南针的项目元时,我立刻看到的第二个位置就是同样的循环。好吧Bukkit不喜欢说itemStack有一个itemMeta,直到你分配一个,所以试试这个:

if(item.getType() == Material.COMPASS){
    if(item.hasItemMeta()){
        if(item.getItemMeta().getDisplayName().contains(ChatColor.AQUA + "Menu"){
            p.sendMessage("found properly named compass");
            return;
        }
    }
}

如果你想要一个更简单的方法,我建议使用以下示例代码:

ItemStack compass = new ItemStack(Material.COMPASS);
ItemMeta compassMeta = compass.getItemMeta();

//No need to use ChatColor.RESET before the text has a color
compassMeta.setDisplayName(ChatColor.AQUA + "Menu");

compass.setItemMeta(compassMeta);

for(ItemStack item:e.getPlayer().getInventory().getContents()){
    if(item != null){
        if(item.equals(compass)){
            p.sendMessage("found properly named compass");
            return;
        }
    }
}

希望这对你有所帮助。

答案 2 :(得分:-1)

.equals和==不是一回事。

.equals比较对象的值。

==比较对象的引用。

示例:

Integer x = 10; Integer y = 10;

x == y是假的

x.equals(y)是真的