使用数组时出现Java NullPointerException

使用数组时出现Java NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我正在尝试用Java制作一个RPG,我正在尝试制作一个随机遭遇系统。我需要在eclipse控制台中显示敌人的名字,我知道这些值是设置好的,因为我以前打印过这些名字,但是Java给了我一个nullpointerexception public class Enemies { static Enemies Slime = null; static Enemies Rat = null; static Enemies Goblin = null; //static Enemies Slime, Rat

我正在尝试用Java制作一个RPG,我正在尝试制作一个随机遭遇系统。我需要在eclipse控制台中显示敌人的名字,我知道这些值是设置好的,因为我以前打印过这些名字,但是Java给了我一个nullpointerexception

public class Enemies {
static Enemies Slime = null;
static Enemies Rat = null;
static Enemies Goblin = null;
//static Enemies Slime, Rat, Goblin;/*, Bandits, Sand_Worm, Antlion, Sand_Golem;*/
static Enemies[] Enemies = {Slime, Rat, Goblin};/*, Bandits, Sand_Worm, Antlion,           Sand_Golem*};*/
static Enemies[] monsters = {null,null,null,null};
int Atk;
int Def;
int Spd;
int Sp_Atk;
int Sp_Def;
int Hp;
int MaxHp;
int MinHp;
double Hptrue;
int Mp;
int MaxMp;
int MinMp;
int Level;
int MinLevel;
int MaxLevel; 
double XP_Modifier;
int MaxXp;
int MaxAtk;
int MaxDef;
int MaxSpd;
int MaxSp_Atk;
int MaxSp_Def;
int MinAtk;
int MinDef;
int MinSpd;
int MinSp_Atk;
int MinSp_Def;
String Name;

static void setstats(){
    //slime
    Slime = new Enemies();
    Slime.Name = "Slime";
    Slime.MaxHp = 10;
    Slime.MaxMp = 0;
    Slime.MinHp = 5;
    Slime.MinMp = 0;
    Slime.MaxAtk = 2;
    Slime.MaxDef = 0;
    Slime.MaxSpd = 3;
    Slime.MaxSp_Atk = 1;
    Slime.MaxSp_Def = 5;
    Slime.MinAtk = 1;
    Slime.MinDef = 0;
    Slime.MinSpd = 1;
    Slime.MinSp_Atk = 0;
    Slime.MinSp_Def = 2;
    Slime.MinLevel = 1;
    Slime.MaxLevel = 3;
    Slime.MaxXp = 10;
    Slime.XP_Modifier = 0.3;

    //rat
    Rat = new Enemies();
    Rat.Name = "Rat";
    Rat.MaxHp = 15;
    Rat.MaxMp = 0;
    Rat.MinHp = 5;
    Rat.MinMp = 0;
    Rat.MaxAtk = 5;
    Rat.MinAtk = 2;
    Rat.MaxDef = 3;
    Rat.MinDef = 1;




    //goblin
    Goblin = new Enemies();
    Goblin.Name = "Goblin";
    Goblin.MaxHp = 25;
    Goblin.MaxMp = 5;
    Goblin.MinHp = 10;
    Goblin.MinMp = 0;
} 
}
这是我的敌人阶级

static void Encounters(){
    encounter = (Math.random() * 100);
    System.out.println(encounter);
    if(encounter * Ph10.player.Lck < 40){
        Battle.battle();
    }

}
static void monster_creation(){
    Enemies.setstats();
    monster_amount =  (int) (Math.random() * 4);
    System.out.println(monster_amount);
    for (int i = 0; i < monster_amount; i++){
            Enemies.monsters [i]= Enemies.Enemies[ (int) (Math.random() * 2)];
            System.out.println(Enemies.monsters[i].Name);


    }
静态void遭遇(){
遭遇=(Math.random()*100);
系统输出打印(遭遇);
如果(遭遇*Ph10.player.Lck<40){
战斗;
}
}
静态虚空怪物_创建(){
敌人;
monster_amount=(int)(Math.random()*4);
系统输出打印项次(金额);
对于(int i=0;i
我的随机化课的相关部分

if( Map_Movement.tilenum < 34 ){
    battlezone = 0;
    Randomization.monster_creation();
}
if(Map_Movement.tilenum<34){
战场=0;
随机化。怪物_创建();
}
我的战斗课的相关部分

非常感谢您的帮助!

Java中的变量从来都不是“引用”

在创建敌人阵列之前创建敌人对象,例如

static Enemies createSlime (){
   Enemies slime = new Enemies();
   // ..
   return slime;
}

// i.e.
static Enemies Slime = createSlime();
static Enemies[] Enemies = {Slime, ..};
// or even
static Enemies[] Enemies = {createSlime(), ..};
或者只在创建敌人后将其添加到阵列中(在此处使用列表/阵列列表会更好),例如

还有很多问题可以解决,但这应该足以进入下一个问题-玩得开心!

static Enemies[] Enemies = new Enemies[3];
settats方法

static void setstats(){
//slime
Slime = new Enemies();
Slime.Name = "Slime";
Slime.MaxHp = 10;
Slime.MaxMp = 0;
Slime.MinHp = 5;
Slime.MinMp = 0;
Slime.MaxAtk = 2;
Slime.MaxDef = 0;
Slime.MaxSpd = 3;
Slime.MaxSp_Atk = 1;
Slime.MaxSp_Def = 5;
Slime.MinAtk = 1;
Slime.MinDef = 0;
Slime.MinSpd = 1;
Slime.MinSp_Atk = 0;
Slime.MinSp_Def = 2;
Slime.MinLevel = 1;
Slime.MaxLevel = 3;
Slime.MaxXp = 10;
Slime.XP_Modifier = 0.3;
Enemies[0] = Slime

//rat
Rat = new Enemies();
Rat.Name = "Rat";
Rat.MaxHp = 15;
Rat.MaxMp = 0;
Rat.MinHp = 5;
Rat.MinMp = 0;
Rat.MaxAtk = 5;
Rat.MinAtk = 2;
Rat.MaxDef = 3;
Rat.MinDef = 1;
Enemies[1] = Rat

//goblin
Goblin = new Enemies();
Goblin.Name = "Goblin";
Goblin.MaxHp = 25;
Goblin.MaxMp = 5;
Goblin.MinHp = 10;
Goblin.MinMp = 0;
Enemies[2] = Goblin
} 
编辑说明-
您真正需要做的就是不要将空值放入数组中。因此,我更改了数组的声明,使其不包含这些值,因为此时这些值仍然为空。敌人是在setStats方法中创建的,因此您应该将其放入数组中。如果您有任何其他问题,请随时询问你认为NPE?
static void敌人createSlime
不会编译确保解释/突出显示相关更改。你应该建议他编写更好的代码,而不是重复OP的错误,例如命名(
敌人
-->
敌人
)、缩进、整体设计等。
static Enemies[] Enemies = new Enemies[3];
static void setstats(){
//slime
Slime = new Enemies();
Slime.Name = "Slime";
Slime.MaxHp = 10;
Slime.MaxMp = 0;
Slime.MinHp = 5;
Slime.MinMp = 0;
Slime.MaxAtk = 2;
Slime.MaxDef = 0;
Slime.MaxSpd = 3;
Slime.MaxSp_Atk = 1;
Slime.MaxSp_Def = 5;
Slime.MinAtk = 1;
Slime.MinDef = 0;
Slime.MinSpd = 1;
Slime.MinSp_Atk = 0;
Slime.MinSp_Def = 2;
Slime.MinLevel = 1;
Slime.MaxLevel = 3;
Slime.MaxXp = 10;
Slime.XP_Modifier = 0.3;
Enemies[0] = Slime

//rat
Rat = new Enemies();
Rat.Name = "Rat";
Rat.MaxHp = 15;
Rat.MaxMp = 0;
Rat.MinHp = 5;
Rat.MinMp = 0;
Rat.MaxAtk = 5;
Rat.MinAtk = 2;
Rat.MaxDef = 3;
Rat.MinDef = 1;
Enemies[1] = Rat

//goblin
Goblin = new Enemies();
Goblin.Name = "Goblin";
Goblin.MaxHp = 25;
Goblin.MaxMp = 5;
Goblin.MinHp = 10;
Goblin.MinMp = 0;
Enemies[2] = Goblin
}