2013-01-20 2 views
-1

좋아, 그래서 이클립스를 사용하여 Minecraft 용 Bukkit 플러그인을 만들었습니다. 몇 가지 이유로, 나는 겉보기에 무리한 NullPointerExceptions를 많이 받고있다. null 값인 varriable 유형의 값과 함수를 사용하려고하면 NullPointerExceptions이 발생하는 것으로 나타났습니다. 내 코드에서 찾을 수 없으므로 다른 사람이 찾을 수 있는지보고 싶었습니다.java가 왜이 NullPointerException을 제공합니까?

오류 : 여기

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)

그리고 내 실제 플러그인 코드 :

nakib 내 질문에 대답하고, 오류가 해결되었습니다 UPDATE가

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;
}
}

! 고마워요! 라인 73에

+0

Java에서'NullPointerException'을 주면'null'이 아닌 것처럼'null' 객체를 사용하려고합니다. 코드에서 어떤 라인이 예외를 생성합니까? –

+0

@JackManey 오류를 보셨습니까? 그것은 73 행을 말합니다. –

+1

왜 [SSCCE]가 아닌 행 (http://sscce.org/)을 계산해야합니까? –

답변

2

, 당신은 onDisable()가 호출 될 때

for(NewItem item : items.keySet()) 

속성 items가 null 있습니다.

당신은 items 변수가 null해야 선언

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

하지만 어떻게 가능할까요? OnEnable에서 설정합니다. 심지어 try/catch 블록이 설정되어 있는지 확인합니다! 어떻게 이런 일이 일어날까요 ???? –

+0

아마도 onEnable()은 onDisable() 이후에만 호출됩니다. 또한 onEnable()에서 실패하고 catch 블록이 속성을 초기화합니다. – nakib

1

items를 초기화해야한다,이 문제를 해결합니다. 당신은 잠재적으로 클래스의 상단이 그것을 고칠 수 :

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

당신은 당신이 초기화되어있어 가정 두 영역을 가지고있는 것처럼 당신이 보는, 그래서 어느 클래스의 상단에 그것을 할 것입니다, 또는 귀하의 생성자 (아직 존재하지 않는 :)).

1

외모에서 보면 items (73 행)이 null이고 그 값을 요구할 것입니다. 28 행의 for 블록이 적어도 한 번 이상 실행되지 않으면 메서드가 호출되지 않도록 무언가를 추가하십시오.

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에서 코드를 통해 이러한 메시지뿐만 아니라 단계를 해석하는 방법을 배우는 것이 중요합니다. 이러한 도구가 없으면 대규모 코드 기반을 탐색 할 준비가되지 않은 것입니다.

또 다른 조언을 드리 자면 smap은 객체 지향적이지 않습니다. 어떤 종류의 캡슐화가 여기에 도움이 될 것이므로 의 Map이 필요하지 않습니다 ..... 우리는 다시 무슨 이야기를 했습니까?