当前位置: 首页 > 知识库问答 >
问题:

Minecraft Spigot/Bukkit 插件在相等性检查时抛出 NullPointerException

孟成文
2023-03-14

我正在尝试创建一个菜单,我想确保所有玩家都有加入的指南针。

我的代码不起作用——如果你的库存中有一个没有命名的指南针,它就不能给你指南针。如果我没有检查这些==null,我的代码会给出一个带有上述条件的NullPointerException

Eclipse不显示错误。我做错了什么?

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();

    }

}

共有3个答案

荆树
2023-03-14

<代码>。equals方法和< code>==运算符不是一回事。

.equals 比较对象的值。

==比较对象的引用(内存中的位置)。

例子:

Integer x = 10;
Integer y = 10;

// is false
System.out.println(x == y)

// is true
System.out.println(x.equals(y)) 
罗飞宇
2023-03-14

我看到有几个地方可能会出现NullPointer异常。首先,您正在检查项目是否为空,如果为空,则检查它是否是指南针。但是如果为空,它就不能也是指南针。试试这个:

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

    }
}

我马上看到的第二个点是在同一个for循环中,当你得到指南针的项目元。嗯,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;
        }
    }
}

希望这对你有帮助。

计向晨
2023-03-14

我不知道为什么这有效,但改变

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

item.getType() == Material.COMPASS

成功了。我一直认为这是一回事。

 类似资料:
  • 我试图使一个混合modeauth(我自己的版本的身份验证插件),但有一个问题-在与明星的行,我得到以下错误: 这是我的代码:

  • 问题内容: 据我了解(如果我错了,请纠正我),Hibernate使用对象引用来检查对象的相等性。当Hibernate识别同一数据库记录中有多个对象附加时,它将引发以下异常。 我的问题是,Hibernate是否使用方法检查对象是否相等(默认的equal方法使用对象引用)?如果为true,则重写的方法会改变Hibernate的行为吗? 注意:我的问题不是关于Hibernate持久对象中的实现或方法问题

  • 问题内容: 是否有任何的java utils的,允许检查对象平等,不受 平等 覆盖?由于某些原因,我不想为类提供equals方法。我在单元测试中需要类似 SomeUtils.equals(a,b)之 类的东西 , 它比较所有对象字段(我想是通过反射)。 问题答案: 您可以在Apache Commons EqualsBuilder中使用

  • 问题内容: 如何检查两个切片是否相等? 问题答案: 您需要遍历切片中的每个元素并进行测试。未定义切片的相等性。但是,如果要比较type的值,则有一个函数。

  • 如何检查两个切片是否相等?

  • 我在JUnit测试中检查两个数组列表是否相等时遇到问题。当我测试两个列表是否相等时,它只检查它们的字符串表示形式是否相同。它适用于简单的示例,例如[1,2,3]、[1,2,3]或当列表包含以字符串表示的所有属性的对象时。但是当我有两个具有相同字符串表示形式但某些对象具有不同属性的列表时,我如何检查它们的相等性? 例如: 如果我有类Human的对象(int height,int weight,boo