2015-06-04 3 views
0

Похоже, что у меня проблемы. Я пытаюсь прочитать случайное значение в перечислении, хотя я пытаюсь выполнить это. Я не совсем уверен, что здесь не так, но, надеюсь, кто-то может научить меня, что я делаю неправильно!Nullpointer При чтении Enum

Таким образом, это ошибка, я получаю:

java.lang.NullPointerException at com.foxtrot.game.player.dialogues.impl.npcs.Child.run(Child.java:89) at com.foxtrot.game.player.DialogueManager.continueDialogue(DialogueManager.java:31) at com.foxtrot.net.decoders.WorldPacketsDecoder.processPackets(WorldPacketsDecoder.java:1127) at com.foxtrot.net.decoders.WorldPacketsDecoder.decode(WorldPacketsDecoder.java:282) at com.foxtrot.net.ServerChannelHandler.messageReceived(ServerChannelHandler.java:128) at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:88) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108) at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:318) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

Это заявление, где я получаю мою ошибку:

 if (player.getMonsterTask() == null) { 
      player.getMonsterTask().applyTask(); 
      int amount = monsterHandler.getAmount(); 
      int id = player.getMonsterTask().getId(); 
      String name = NPCDefinitions.getNPCDefinitions(id).getName(); 
      send("Go, warrior! Go and kill ", "x"+amount+" of "+name+"!"); 
      return; 
     } 

player.getMonsterTask().applyTask(); является линия 89.

public enum tasks { 

    ROCK_CRAB(1265, 5, 50, 1, 7500), 
    MAGIC_AXE(127, 5, 15, 1, 3000), 
    CHAOS_DRUID(181, 5, 30, 1, 4000), 
    MAN(2, 2, 10, 1, 1000), 
    ROCK_GOLEM(3027, 1, 3, 1, 10000), 
    GIANT_BAT(78, 5, 20, 1, 5000), 
    OGRE(3419, 5, 60, 20, 12000), 
    POISON_SPIDER(134, 10, 50, 25, 15000), 
    CHAOS_DWARF(119, 5, 60, 30, 15000), 
    CYCLOPS(6081, 15, 40, 35, 18000), 
    ICE_WOLF(6052, 15, 40, 35, 19000), 
    GIANT_SPIDER(2035, 15, 70, 40, 20000), 
    HILL_GIANT(117, 15, 55, 45, 50000), 
    MOSS_GIANT(1681, 20, 50, 47, 25000), 
    GIANT_ROCK_CRAB(2885, 10, 90, 75, 75000); 

    private int id, minAmount, maxAmount, levelReq, reward; 
    private Player player; 
    private MonsterHandler monsterHandler; 
    public boolean completed = false; 

    private static final List<tasks> VALUES = Collections.unmodifiableList(Arrays.asList(values())); 
    private static final int SIZE = VALUES.size(); 
    private static final Random RANDOM = new Random(); 

    tasks(int id, int minAmount, int maxAmount, int level, int reward) { 
     this.id = id; 
     this.minAmount = minAmount; 
     this.maxAmount = maxAmount; 
     this.levelReq = level; 
     this.reward = reward; 
    } 

    public int getReward() { 
     return reward; 
    } 

    public int getLevelReq() { 
     return levelReq; 
    } 

    public int getId() { 
     return id; 
    } 

    public int getMinAmount() { 
     return minAmount; 
    } 

    public int getMaxAmount() { 
     return maxAmount; 
    } 

    public void getMonsterTask() { 
     player.setMonsterTask(VALUES.get(RANDOM.nextInt(SIZE))); 
    } 

    public boolean isComplete() { 
     return completed; 
    } 

    public void setComplete(boolean b) { 
     this.completed = b; 
    } 

    public void setReward(int r) { 
     this.reward = r; 
    } 

    public void resetMonster(Player player) { 
     player.getMonsterTask().setComplete(false); 
     player.getMonsterTask().setNpcId(-1); 
     player.getMonsterTask().setReward(-1); 
     monsterHandler.setAmount(-1); 
     player.setMonsterTask(null); 
    } 

    public void setNpcId(int id) { 
     this.id = id; 
    }   

} 

Это мой класс MonsterTasks, из которого извлекается метод applyTask. Дайте мне знать, если вам нужна дополнительная информация!

Спасибо.

+1

'if (player.getMonsterTask() == null) {player.getMonsterTask(). ApplyTask();' При достижении этой строки у вас всегда будет 'NullPointerException', поскольку' player.getMonsterTask() ' будет «null». –

+0

Вводит If, if (player.getMonsterTask() == null) { player.getMonsterTask(). ApplyTask(); потому что player.getMonsterTask() действительно null, следовательно, player.getMonsterTask(). applyTask(); становится null.applyTask(), который генерирует исключение NullPointerException. – cjcroix

ответ

2

if (player.getMonsterTask() == null) это означало бы, что player.getMonsterTask() фактически вернул null.
И на следующей строке player.getMonsterTask().applyTask(); вы фактически делаете null.applyTask(). Отсюда исключение.

0

Вы пытаетесь вызвать метод с нулевой ссылкой. Это возможно только в случае, если метод является статическим, в противном случае NullPointerException будет брошен

0

хорошо, спросите вы, если monster.getTask()==null, а затем вызвать monster.getTask().applyTask() который в основном null.applyTask();) вот где NPE приходит от

0

Я думаю, что у вас есть сделал ошибку в вашем дизайне.

Если вы убрали private Player player; из перечня task и измените код public void getMonsterTask() { на номер public static void getRandomMonsterTask(Player player) {, все станет понятнее.

После некоторого мастерить я получаю что-то вроде:

public enum tasks { 

    ROCK_CRAB(1265, 5, 50, 1, 7500), 
    MAGIC_AXE(127, 5, 15, 1, 3000), 
    CHAOS_DRUID(181, 5, 30, 1, 4000), 
    MAN(2, 2, 10, 1, 1000), 
    ROCK_GOLEM(3027, 1, 3, 1, 10000), 
    GIANT_BAT(78, 5, 20, 1, 5000), 
    OGRE(3419, 5, 60, 20, 12000), 
    POISON_SPIDER(134, 10, 50, 25, 15000), 
    CHAOS_DWARF(119, 5, 60, 30, 15000), 
    CYCLOPS(6081, 15, 40, 35, 18000), 
    ICE_WOLF(6052, 15, 40, 35, 19000), 
    GIANT_SPIDER(2035, 15, 70, 40, 20000), 
    HILL_GIANT(117, 15, 55, 45, 50000), 
    MOSS_GIANT(1681, 20, 50, 47, 25000), 
    GIANT_ROCK_CRAB(2885, 10, 90, 75, 75000); 

    private int id, minAmount, maxAmount, levelReq, reward; 
    //private Player player; 
    private MonsterHandler monsterHandler; 
    public boolean completed = false; 

    private static final List<tasks> VALUES = Collections.unmodifiableList(Arrays.asList(values())); 
    private static final int SIZE = VALUES.size(); 
    private static final Random RANDOM = new Random(); 

    tasks(int id, int minAmount, int maxAmount, int level, int reward) { 
     this.id = id; 
     this.minAmount = minAmount; 
     this.maxAmount = maxAmount; 
     this.levelReq = level; 
     this.reward = reward; 
    } 

    public int getReward() { 
     return reward; 
    } 

    public int getLevelReq() { 
     return levelReq; 
    } 

    public int getId() { 
     return id; 
    } 

    public int getMinAmount() { 
     return minAmount; 
    } 

    public int getMaxAmount() { 
     return maxAmount; 
    } 

    public static void getRandomMonsterTask(Player player) { 
     player.setMonsterTask(VALUES.get(RANDOM.nextInt(SIZE))); 
    } 

    public boolean isComplete() { 
     return completed; 
    } 

    public void setComplete(boolean b) { 
     this.completed = b; 
    } 

    public void setReward(int r) { 
     this.reward = r; 
    } 

    public void resetMonster(Player player) { 
     player.getMonsterTask().setComplete(false); 
     player.getMonsterTask().setNpcId(-1); 
     player.getMonsterTask().setReward(-1); 
     monsterHandler.setAmount(-1); 
     player.setMonsterTask(null); 
    } 

    public void setNpcId(int id) { 
     this.id = id; 
    } 

    private void applyTask() { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

} 

public void test() { 
    Player player = new Player(); 
    if (player.getMonsterTask() == null) { 
     tasks.getRandomMonsterTask(player); 
    } 
    player.getMonsterTask().applyTask(); 
} 

Обратите внимание, что я сделал некоторые предположения относительно вашего намерения.