我正在开发一个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链接,因为它占用了大量空间)
提前谢谢
答案 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();
问题是两件事之一:
p
为空
p.getBedSpawnLocation()
返回的值为null
我们知道它不是#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
}