代码如下:
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)
检查了下代码,不知道错在哪里,很奇怪
理解这个错误需要理解变量的作用域。
函数中声明的变量其作用域是其函数本身,同时会覆盖同名变量。因此,在函数
public Hero(HeroType type)
中,参数type的作用域是这个函数的范围,同时会覆盖类Hero
中的变量public HeroType type
。因此,在这个函数中,type=type
相当于自己给自己赋值,值并没有保存到类的变量中。所有,类中变量type
的值始终是null
。要在这个函数中把参数
type
的值保存到类的变量中,需要使用this.type=type
,左侧的this
指代Hero
这个类,this.type
指代的就是类中的变量。