【问题标题】:Nullpointer When Reading Enum读取枚举时的空指针
【发布时间】:2015-06-04 08:27:35
【问题描述】:

看来我遇到了一些麻烦。我正在尝试读取枚举中的随机值,尽管在尝试执行此操作时遇到了空指针。我不完全确定这里出了什么问题,但希望有人能教我我做错了什么!

所以,这是我得到的错误:

java.lang.NullPointerException 在 com.foxtrot.game.player.dialogues.impl.npcs.Child.run(Child.java:89) 在 com.foxtrot.game.player.DialogueManager.continueDialogue(DialogueManager.java:31) 在 com.foxtrot.net.decoders.WorldPacketsDecoder.processPackets(WorldPacketsDecoder.java:1127) 在 com.foxtrot.net.decoders.WorldPacketsDecoder.decode(WorldPacketsDecoder.java:282) 在 com.foxtrot.net.ServerChannelHandler.messageReceived(ServerChannelHandler.java:128) 在 org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:88) 在 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) 在 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559) 在 org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) 在 org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) 在 org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) 在 org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108) 在 org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:318) 在 org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) 在 org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) 在 org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) 在 org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 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 方法是从中提取的。如果您需要更多信息,请告诉我!

谢谢。

【问题讨论】:

  • if (player.getMonsterTask() == null) { player.getMonsterTask().applyTask(); 当您到达这条线时,您将始终拥有NullPointerException,因为player.getMonsterTask() 将是null
  • 进入 If , if (player.getMonsterTask() == null) { player.getMonsterTask().applyTask();因为 player.getMonsterTask() 确实为 null 因此 player.getMonsterTask().applyTask();变成 null.applyTask() 抛出 NullPointerException。

标签: java enums


【解决方案1】:

if (player.getMonsterTask() == null) 这意味着 player.getMonsterTask() 实际上返回了 null。
在下一行player.getMonsterTask().applyTask(); 中,您实际上正在执行null.applyTask()。因此例外。

【讨论】:

    【解决方案2】:

    您正试图在空引用上调用方法。这只有在方法是静态的时候才有可能,否则会抛出 NullPointerException

    【讨论】:

      【解决方案3】:

      好吧,你问monster.getTask()==null,然后打电话给monster.getTask().applyTask(),基本上是null.applyTask();)这就是NPE的来源

      【讨论】:

        【解决方案4】:

        我认为你的设计有误。

        如果您从task 枚举中删除private Player player; 并将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();
        }
        

        请注意,我对您的意图做了一些猜测。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-22
          • 2013-04-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多