-1

わかりましたので、Eclipse を使用して Minecraft 用の Bukkit プラグインの作成に取り組んでいます。何らかの理由で、一見不合理な NullPointerExceptions が大量に発生しています。値が null である変数の型の値と関数を使用しようとすると、NullPointerExceptions が発生することがわかりました。私のコードでは見つけられなかったので、他の誰かが見つけられるかどうかを確認したかったのです。

エラー:

20:16:58 [SEVERE] java.lang.NullPointerException
20:16:58 [SEVERE]       at com.tommy3244.plugins.MakeYourOwnBlocks.MakeYourOwnBl
ocks.onDisable(MakeYourOwnBlocks.java:73)
20:16:58 [SEVERE]       at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlug
in.java:219)
20:16:58 [SEVERE]       at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin
(JavaPluginLoader.java:481)
20:16:58 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.disablePlugin(S
implePluginManager.java:400)
20:16:58 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.disablePlugins(
SimplePluginManager.java:393)
20:16:58 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.clearPlugins(Si
mplePluginManager.java:434)
20:16:58 [SEVERE]       at org.bukkit.craftbukkit.v1_4_6.CraftServer.reload(Craf
tServer.java:563)
20:16:58 [SEVERE]       at org.bukkit.Bukkit.reload(Bukkit.java:184)
20:16:58 [SEVERE]       at org.bukkit.command.defaults.ReloadCommand.execute(Rel
oadCommand.java:23)
20:16:58 [SEVERE]       at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCo
mmandMap.java:186)
20:16:58 [SEVERE]       at org.bukkit.craftbukkit.v1_4_6.CraftServer.dispatchCom
mand(CraftServer.java:514)
20:16:58 [SEVERE]       at org.bukkit.craftbukkit.v1_4_6.CraftServer.dispatchSer
verCommand(CraftServer.java:506)
20:16:58 [SEVERE]       at net.minecraft.server.v1_4_6.DedicatedServer.al(Dedica
tedServer.java:260)
20:16:58 [SEVERE]       at net.minecraft.server.v1_4_6.DedicatedServer.r(Dedicat
edServer.java:225)
20:16:58 [SEVERE]       at net.minecraft.server.v1_4_6.MinecraftServer.q(Minecra
ftServer.java:494)
20:16:58 [SEVERE]       at net.minecraft.server.v1_4_6.MinecraftServer.run(Minec
raftServer.java:427)
20:16:58 [SEVERE]       at net.minecraft.server.v1_4_6.ThreadServerApplication.r
un(SourceFile:849)

そして、ここに私の実際のプラグインコードがあります:

package com.tommy3244.plugins.MakeYourOwnBlocks;

import java.io.File;
import java.util.*;

import org.bukkit.block.*;
import org.bukkit.command.*;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.*;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

public class MakeYourOwnBlocks extends JavaPlugin implements Listener
{
public Map<NewItem, List<ItemStack>> items;
public File configfile;
@SuppressWarnings("unchecked")
public void onEnable()
{
try
{
Map<List<Map<String, Object>>, NewItem> smap;
smap = SaveLoadAPI.load(this.getDataFolder().getPath()+"\\Items.data");
for(List<Map<String, Object>> maps : smap.keySet())
{
NewItem item = smap.get(maps);
List<ItemStack> stacks = new ArrayList<ItemStack>();
for(Map<String, Object> map : maps)
{
stacks.add(ItemStack.deserialize(map));
}
items.put(item, stacks);
}
}
catch(Exception e)
{
items = new HashMap<NewItem, List<ItemStack>>();
}
try
{
this.getDataFolder().mkdirs();
}
catch(Exception e)
{

}
configfile = new File(getDataFolder(), "config.yml");
if(!configfile.exists())
{
saveResource("config.yml", false);
}
try
{
getConfig().load(configfile);
}
catch(Exception error)
{
getLogger().severe("Could not load config!");
error.printStackTrace();
}
getServer().getPluginManager().registerEvents(this, this);
getLogger().info("MakeYourOwnBlocks successfully enabled!");
}
public void onDisable()
{
try
{
Map<List<Map<String, Object>>, NewItem> smap = new HashMap<List<Map<String, Object>>, NewItem>();
for(NewItem item : items.keySet())
{
List<ItemStack> stacks = items.get(item);
List<Map<String, Object>> stacks2 = new ArrayList<Map<String, Object>>();
for(ItemStack stack : stacks)
{
stacks2.add(stack.serialize());
}
smap.put(stacks2, item);
}
SaveLoadAPI.save(smap, this.getDataFolder().getPath()+"\\Items.data");
}
catch (Exception e)
{
getLogger().severe("Was unable to save the items file to the default path of: "+this.getDataFolder().getPath()+"\\Items.data");
e.printStackTrace();
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onItemStackRightClick(PlayerInteractEvent e)
{
Player player = e.getPlayer();
//getLogger().info("Player "+player.getName()+" has right clicked.");
for(NewItem item : items.keySet())
{
for(ItemStack curstack : items.get(item))
{
ItemMeta lore = ((ItemStack)curstack).getItemMeta();
List<String> lore2 = player.getItemInHand().getItemMeta().getLore();
if(lore == null || lore2 == null)
{
getLogger().info("Pointer null!");
if(lore == null)
{
getLogger().info("Pointer 1 null");
}
else
{
getLogger().info("Pointer 2 null");
}
}
if(lore2.equals(lore))
{
getLogger().info(player.getDisplayName()+" right clicked with the same item!");
boolean right = e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK;
boolean block = e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK;
boolean worked;
if(right)
{
worked = item.onRightClick(player, right, block);
}
else
{
worked = item.onLeftClick(player, right, block);
}
if(!worked)
{
player.sendMessage("Script fault! Error raised.");
}
}
}
}
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
if(sender instanceof Player)
{

}
else
{
sender.sendMessage("You must be a player to perform this command!");
return false;
}
if(cmd.getName().equalsIgnoreCase("makeitem"))
{
if(args.length < 4)
{
return false;
}
String name = args[0];
String type = args[1];
String data = args[2];
String damage = args[3];
try
{
int dmg = Integer.parseInt(damage);
byte dta = (byte)Integer.parseInt(data);
int id = Integer.parseInt(type);
if(getConfig().contains("items."+name))
{
ConfigurationSection section = getConfig();
List<List<String>> lines = new ArrayList<List<String>>();
lines.add(null);
lines.add(null);
if(getConfig().contains("items."+name+".onrightclick"))
{
List<String> cur = getConfig().getStringList("items."+name+".onrightclick");
lines.set(0, cur);
}
else
{
lines.set(0, null);
}
if(getConfig().contains("items."+name+".onleftclick"))
{
List<String> cur = getConfig().getStringList("items."+name+".onleftclick");
lines.set(1, cur);
}
else
{
lines.set(1, null);
}
List<ItemStack> stacks = new ArrayList<ItemStack>();
ItemStack stack = new ItemStack(id, 1, dta);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(name);
List<String> lore;
if(getConfig().contains("items."+name+".description"))
{
lore = getConfig().getStringList("items."+name+".description");
}
else
{
lore = new ArrayList<String>();
}
lore.add(name);
NewItem item = new NewItem(lore, name, id, dta, lines, dmg, false, section);
meta.setLore(lore);
stack.setItemMeta(meta);
getLogger().info(stack.toString());
stacks.add(stack);
if(items == null)
{
getLogger().info("unused");
}
items.put(item, stacks);
Player player = (Player)sender;
player.getLocation().getWorld().dropItem(player.getLocation(), stack);
player.sendMessage("Here you go!");
}
else
{
sender.sendMessage("No configuration section at \""+"items."+name+"\"");
return true;
}
}
catch(Exception error)
{
//sender.sendMessage("Error: "+error.getLocalizedMessage());
//System.out.println(error);
//throw error;
//makeitem test 272 0 0
error.printStackTrace();
return true;
}
sender.sendMessage("Error: No command specified");
}
return true;
}
}

アップデート:

nakib が私の質問に答え、エラーが修正されました! どうもありがとう!

4

4 に答える 4

2

73行目で、

for(NewItem item : items.keySet())

が呼び出されたとき、プロパティitemsは nullです。onDisable()

これを解決するには、itemson 宣言を初期化する必要があります

public Map<NewItem, List<ItemStack>> items = new HashMap<NewItem, List<ItemStack>>();
于 2013-01-20T02:28:15.820 に答える
1

見た目からすると、items(73 行目) が null であることに賭けます。その値を呼び出します。28 行目の for ブロックが 1 回も実行されない場合にメソッドが呼び出されないように、何かを追加します。

于 2013-01-20T02:29:45.617 に答える
1

items変数は でなければなりませんnull。クラスの先頭でこれを修正できる可能性があります。

public Map<NewItem, List<ItemStack>> items = new HashMap<NewItem, List<ItemStack>>();

初期化されたと思われる領域がいくつかあるように見えるので、クラスの上部またはコンストラクターで実行します(まだ存在しません:))。

于 2013-01-20T02:29:13.770 に答える
0

スタックトレースは、が次のNullPointerExceptionものから来ていることを示しています。

    20:16:58 [SEVERE] java.lang.NullPointerException
    20:16:58 [SEVERE]       at com.tommy3244.plugins.MakeYourOwnBlocks.MakeYourOwnBl
    ocks.onDisable(MakeYourOwnBlocks.java:73) <-- HELPFUL ADVICE FROM STACK TRACE


68     public void onDisable()
69        {
70          try
71            {
72              Map<List<Map<String, Object>>, NewItem> smap = new HashMap<List<Map<String, Object>>, NewItem>();
73              for(NewItem item : items.keySet()) <--- THIS LINE IS PUKING, SO items is probably null!

これらのメッセージを解釈する方法を学び、デバッガーを使用して最新の IDE でコードをステップ実行することが重要です。これらのツールがなければ、大規模なコード ベースをナビゲートする準備が整っていません。

もう 1 つアドバイスしたいのは、これsmapはあまりオブジェクト指向ではないということです。なんらかのカプセル化がここで役立つので、Mapa の aListの a のa は必要ありませんMap

于 2013-01-20T02:34:45.873 に答える