2014-06-10 2 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}; 

어느 적 개체 생성 적 배열을 만들기 전에, 예를 들어

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(), ..}; 

(예 : List/ArrayList를 사용하여 생성 된 적이있는 경우에만) 적을 배열에 추가하십시오 (예 :

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

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

해결할 수있는 더 많은 문제가 있지만 다음 호로 넘어갈 수있을만큼 재미 있어야합니다. 설명에 대한

+0

'static void Enemies createSlime'은 컴파일되지 않습니다 – 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 
} 

편집 - 당신이 정말로 배열 적으로 null 값을 넣지하기 만하면됩니다. 그래서 배열의 선언을이 시점에서 Null 이었기 때문에 값을 포함하지 않도록 변경했습니다. 적군은 setStats 메서드에서 생성되므로 배열에 배치해야합니다. 다른 질문이 있으면 언제든지 문의하십시오

+1

관련 변경 사항을 설명하고 강조 표시하십시오. – user2864740

+0

이름 짓기 ('Enemies' ->'Enemy'), 들여 쓰기, 전체 디자인 등 OP의 오류를 반복하는 대신 더 나은 코드를 제안해야합니다. –