2014-06-10 31 views
-1

我想在Java中製作一個RPG,並且我試圖製作一個隨機相遇系統。我需要在eclipse控制檯中顯示敵人的名字,並且我知道這些值是因爲我以前打印過名字而設置的,但是Java給了我一個nullpointerexception。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); 


    } 

我隨機類的相關部分。

if(Map_Movement.tilenum < 34){ 
    battlezone = 0; 
    Randomization.monster_creation(); 
} 

我的戰鬥類的相關部分。

任何和所有幫助表示讚賞!

+0

什麼生產線給你NPE? –

回答

1

Java中的變量是從不「引用」。

static Enemies Slime = null; 
static Enemies Rat = null; 
static Enemies Goblin = null; 

// This evaluation of the variables (e.g. Slime) happens RIGHT NOW. 
static Enemies[] Enemies = {Slime, Rat, Goblin}; 

// Such that it is equivalent to the following 
// (Which cause an NPE on Enemies.monsters[i].Name in the loop) 
static Enemies[] Enemies = {null, null, null}; 

要麼創建敵人對象之前創建敵人陣列,例如或者只有在創建它們時纔將這些敵人添加到數組中(使用List/ArrayList在這裏會更好),例如,在創建數組時,只需要將敵人添加到數組中。

static Enemies[] Enemies = new Enemies[3]; 

static void setstats(){ 
    //slime 
    Enemies slime = new Enemies(); 
    Enemies[0] = slime; 
    // .. 
} 

還有很多可以修復的詭計,但是這應該足以進入下一個問題 - 玩得開心!

+0

'static void Enemies createSlime' would not compile – RossBille

+0

@RossBille Whooops and thanks(fixed)。 – user2864740

1

聲明

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方法中創建的,所以這是你應該把它放在數組中的地方。隨意問你是否有其他問題

+1

請務必解釋/突出顯示相關更改。 – user2864740

+0

你應該建議他更好的代碼,而不是重複OP的錯誤,比如命名('Enemies' - >'Enemy'),縮進,整體設計等。 –