Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取枚举时使用空指针_Java_Enums - Fatal编程技术网

Java 读取枚举时使用空指针

Java 读取枚举时使用空指针,java,enums,Java,Enums,看来我有点麻烦了。我正在尝试读取枚举中的随机值,尽管在尝试执行此操作时遇到了空指针。我不完全确定这里出了什么问题,但希望有人能教我做错了什么 这就是我得到的错误: java.lang.NullPointerException 位于com.foxtrot.game.player.dialogies.impl.npcs.Child.run(Child.java:89) 在com.foxtrot.game.player.DialogueManager.continueDialogue(Dialogue

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

这就是我得到的错误:

java.lang.NullPointerException 位于com.foxtrot.game.player.dialogies.impl.npcs.Child.run(Child.java:89) 在com.foxtrot.game.player.DialogueManager.continueDialogue(DialogueManager.java:31) 在com.foxtrot.net.decoders.WorldPacketsCoder.processPackets(WorldPacketsCoder.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.niower.read(niower.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.niower.run(niower.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(未知源)

这是我收到错误的声明:

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

}
公共枚举任务{
岩蟹(1265,5,50,1750),
魔斧(127,5,15,1,3000),
混沌德鲁伊(181,5,30,14000),
男人(2,2,10,1100),
摇滚傀儡(3027,1,3,1,10000),
巨蝠(78,5,20,15000),
食人魔(3419,5,60,20,12000),
毒蛛(134,10,50,25,15000),
混沌矮星(119,5,60,30,15000),
独眼巨人(6081,15,40,35,18000),
ICE_WOLF(6052,15,40,35,19000),
巨蜘蛛(2035,15,70,40,20000),
巨人山(117,15,55,45,50000),
摩丝巨人(1681,20,50,47,25000),
巨蟹(2885,10,90,75,75000);
私有int id、minAmount、maxAmount、levelReq、奖励;
私人玩家;
私人怪物处理者怪物处理者;
public boolean completed=false;
私有静态最终列表值=Collections.unmodifiableList(Arrays.asList(VALUES());
私有静态最终int SIZE=VALUES.SIZE();
私有静态最终随机=新随机();
任务(整数id、整数minAmount、整数maxAmount、整数级别、整数奖励){
this.id=id;
this.minAmount=minAmount;
this.maxAmount=maxAmount;
this.levelReq=级别;
这个。奖励=奖励;
}
public int getraward(){
回报奖励;
}
public int getLevelReq(){
返回levelReq;
}
公共int getId(){
返回id;
}
公共int getMinAmount(){
返回米纳山;
}
public int getMaxAmount(){
返回最大金额;
}
public void getMonsterTask(){
player.setMonsterTask(VALUES.get(RANDOM.nextInt(SIZE));
}
公共布尔值isComplete(){
返回已完成;
}
公共void集合完成(布尔b){
此参数=b;
}
公共奖励(INTR){
这个。奖励=r;
}
公共无效重置怪物(玩家){
player.getMonsterTask().setComplete(false);
player.getMonsterTask().setNpcId(-1);
player.getMonsterTask().setReward(-1);
monsterHandler.setAmount(-1);
player.setMonsterTask(空);
}
公共无效setNpcId(内部id){
this.id=id;
}           
}
这是我的MonsterTasks类,applyTask方法是从中提取的。如果您需要更多信息,请告诉我

谢谢。

如果(player.getMonsterTask()==null)
这意味着player.getMonsterTask()实际上返回了null。

在下一行
player.getMonsterTask().applyTask()
您实际上正在执行一个
null.applyTask()
。因此出现了异常。

您试图对空引用调用方法。这只有在方法是静态的情况下才可能发生,否则将抛出NullPointerException

好吧,您询问if
monster.getTask()==null
,然后调用
monster.getTask().applyTask()
,基本上是
null.applyTask()
)这就是NPE的来源

我认为你在设计中犯了一个错误

如果您删除
私人玩家
任务
枚举并将
公共无效getMonsterTask(){
更改为
公共静态无效getRandomMonsterTask(玩家){
事情变得更清楚了

经过一些修补,我得到了如下结果:

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();
}
公共枚举任务{
岩蟹(1265,5,50,1750),
魔斧(127,5,15,1,3000),
混沌德鲁伊(181,5,30,14000),
男人(2,2,10,1100),
摇滚傀儡(3027,1,3,1,10000),
巨蝠(78,5,20,15000),
食人魔(3419,5,60,20,12000),
毒蛛(134,10,50,25,15000),
混沌矮星(119,5,60,30,15000),
独眼巨人(6081,15,40,35,18000),
ICE_WOLF(6052,15,40,35,19000),
巨蜘蛛(2035年,2015年,