Java Bukkit插件上的RegisteredListener.callEvent错误

时间:2014-07-14 16:08:16

标签: java eclipse plugins minecraft bukkit

我正在开发一个Bukkit插件,我正在开发的一项功能涉及一个侦听器,它可以检测播放器何时右键单击一个床,然后向他们发送消息并写入数据到YML文件(不是配置)。以前,每当床与之交互时它都会这样做,但是现在当它与它交互时会在控制台中出现错误。

这是我的听众:

public class listener
  implements Listener
{
  public static main plugin;

  public listener(main instance)
  {
    plugin = instance;
  }

  @EventHandler
  public void onPlayerInteract(PlayerInteractEvent event) throws IOException{
    File file = new File(listener.plugin.getDataFolder(), "beds.yml");
    if(!file.exists()) {
        file.createNewFile();
        }
    YamlConfiguration yml = YamlConfiguration.loadConfiguration(file);
    Player p = event.getPlayer();
    String dn = p.getDisplayName();
    dn = ChatColor.stripColor(dn);
    double x = p.getBedSpawnLocation().getX();
    double z = p.getBedSpawnLocation().getZ();
    double y = p.getBedSpawnLocation().getY();
    World w = p.getBedSpawnLocation().getWorld();
    String wn = w.getName();
    if ((event.getAction() == Action.RIGHT_CLICK_BLOCK) {
        if (event.getClickedBlock().getType() == Material.BED_BLOCK)
            p.sendMessage(ChatColor.DARK_GREEN + "Bed home set!");
            yml.set(dn + ".x", x);
            yml.set(dn + ".y", y);
            yml.set(dn + ".z", z);
            yml.set(dn + ".world", wn);
            try {
                yml.save(file);
                } catch (IOException ex) {
                ex.printStackTrace();
                }

  }
}
}

这是我得到的错误:

http://pastebin.com/iYX27RnA(pastebin链接,因为它占用了大量空间)

提前谢谢

1 个答案:

答案 0 :(得分:1)

您正在获得NullPointerException

Caused by: java.lang.NullPointerException

当您的代码尝试在值为NullPointerException的对象上调用方法时,抛出null。您的错误还指出错误位于listener.java类的第37行:

at me.Superior_Slime.bedhome.listener.onPlayerInteract(listener.java:37)

哪一行:

double x = p.getBedSpawnLocation().getX();

问题是两件事之一:

  1. p为空

  2. p.getBedSpawnLocation()返回的值为null

  3. 我们知道它不是#1,因为没有播放器的PlayerInteractEvent,所以它必须是#2,从p.getBedSpawnLocation()返回的值为空。

    问题是来自PlayerInteractEvent的播放器没有床产生位置,因此,p.getBedSpawnLocation()返回null。然后,当您尝试在其上调用另一个方法时,例如.getX(),您会得到一个NullPointerException,因为您尝试在一个空的对象上调用方法。

    要解决此问题,您应该创建一个if语句来检查天气是否有玩家有床产卵位置:

    if(p.getBedSpawnLocation() != null){//the bed spawn location is not null
      //code here
    }