【JAVA小白】 学习枚举的时候遇到一个空指针异常,不知道为什么

代码如下:

package com;

public enum HeroType {
    TANK,
    WIZARD,
    ASSASSIN,
    ASSIST,
    WARRIOR,
    RANGED,
    PUSH,
    FARMING
}

package com;

public class LeagueOfLegends {

    public static void show(HeroType type) {
        switch (type) {
        case TANK:
            System.out.println("坦克");
            break;
        case WIZARD:
            System.out.println("法师");
            break;
        case ASSASSIN:
            System.out.println("刺客");
            break;
        case ASSIST:
            System.out.println("辅助");
            break;
        case WARRIOR:
            System.out.println("近战");
            break;
        case RANGED:
            System.out.println("远程");
            break;
        case PUSH:
            System.out.println("推进");
            break;
        case FARMING:
            System.out.println("打野");
            break;
        }
    }
    
    public static void main(String[] args) {
        Hero a1 = new Hero(HeroType.TANK);
        Hero a2 = new Hero(HeroType.WIZARD);
        Hero a3 = new Hero(HeroType.ASSASSIN);
        Hero a4 = new Hero(HeroType.ASSIST);
        Hero a5 = new Hero(HeroType.WARRIOR);
        Hero a6 = new Hero(HeroType.RANGED);
        Hero a7 = new Hero(HeroType.PUSH);
        Hero a8 = new Hero(HeroType.FARMING);
        
        System.out.println("-------------------------");
        
        LeagueOfLegends.show(a1.type);
        LeagueOfLegends.show(a2.type);
        LeagueOfLegends.show(a3.type);
        LeagueOfLegends.show(a4.type);
        LeagueOfLegends.show(a5.type);
        LeagueOfLegends.show(a6.type);
        LeagueOfLegends.show(a7.type);
        LeagueOfLegends.show(a8.type);
        
    }

}


class Hero {
    public HeroType type;
    
    public Hero(HeroType type) {
        type = type;
    }
}

执行的时候报错:

-------------------------
Exception in thread "main" java.lang.NullPointerException
    at com.LeagueOfLegends.show(LeagueOfLegends.java:6)
    at com.LeagueOfLegends.main(LeagueOfLegends.java:46)

检查了下代码,不知道错在哪里,很奇怪

阅读 3.9k
2 个回答

理解这个错误需要理解变量的作用域。

函数中声明的变量其作用域是其函数本身,同时会覆盖同名变量。因此,在函数public Hero(HeroType type)中,参数type的作用域是这个函数的范围,同时会覆盖类Hero中的变量public HeroType type。因此,在这个函数中,type=type相当于自己给自己赋值,值并没有保存到类的变量中。所有,类中变量type的值始终是null

要在这个函数中把参数type的值保存到类的变量中,需要使用this.type=type,左侧的this指代Hero这个类,this.type指代的就是类中的变量。

public Hero(HeroType type) {
    type = type;
}

改成

public Hero(HeroType type) {
    this.type = type;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题