2015-07-13 55 views
0

这是我的战士类。我想在这个班上有一批勇士。 这个想法是能够调用像这样的方法 - > warrior.select(1)在哪里它会得到在索引1创建的战士。希望这是有道理的。 请向我解释为什么这个错误正在发生。为什么我在我的数组索引0上遇到了stackoverflow错误

Exception in thread "main" java.lang.StackOverflowError 
    at pking.Warrior.<init>(Warrior.java:42) 

代码

package pking; 

public class Warrior { 

    private String name; 
    private int age; 
    private String call; 
    private int attackPower; 
    private String weapon; 

    public Warrior(String myName, int myAge, String myCall, int myAttackPower) { 
     name = myName; 
     age = myAge; 
     call = myCall; 
     attackPower = myAttackPower; 
     weapon = ""; 
     Warrior[] warriors = new Warrior[4]; 
     warriors[0] = new Warrior("Spartacus", 40, "I AM SPARTACUS!", 9000); 
     warriors[1] = new Warrior("Crixus", 35, "CHAMPION OF CAPUA", 8000); 
     warriors[2] = new Warrior("Gannicus", 30, "SLAYER", 8000); 
     warriors[3] = new Warrior("Alexander", 21, "I AM ALEXANDER, THE CODER", 0); 
    } 

    //Prints warriors name 
    public void name() { 
     System.out.println(name); 
    } 

    //Prints warriors age 
    public void age() { 
     System.out.println(age); 
    } 

    //Prints warriors call 
    public void warriorsCall() { 
     System.out.println(call); 
    } 

    //Prints warriors attack power 
    public void attackPower() { 
     System.out.println(attackPower); 
    } 

    //Equips warriors weapon and prints message 
    public void equip(String myWeapon) { 
     weapon = myWeapon; 
     System.out.println("Equiped the: " + weapon); 
    } 

    //Prints warriors weapon 
    public void weapon() { 
     System.out.println(weapon); 
    } 

} 
+7

要调用的'Warrior'构造*** ***里面的'Warrior'构造。这是递归的。不要以为这就是你想要做的。 – sstan

+0

@sstan尼斯现货! – MadProgrammer

+0

感谢您的快速回复。所以,你说我不能在构造函数中创建战士。那么我应该怎么做呢?我试图在实例变量下创建数组,但是我得到相同的错误。 –

回答

6

你的构造函数运行一个无限循环,因为你是递归调用它。检查你的构造这些行:

Warrior[] warriors = new Warrior[4]; 
    warriors[0] = new Warrior("Spartacus", 40, "I AM SPARTACUS!", 9000); 
    warriors[1] = new Warrior("Crixus", 35, "CHAMPION OF CAPUA", 8000); 
    warriors[2] = new Warrior("Gannicus", 30, "SLAYER OF VAGINAS", 8000); 
    warriors[3] = new Warrior("Alexander", 21, "I AM ALEXANDER, THE CODER", 0); 

为您调用相同的构造每个战士阵列项目实例,再次尝试创建数组并初始化项目,继续这样跌下去,直到堆栈溢出。

更好的设计策略是创建一个新类,说Legion,其中将包含的Warrior个集合:

public class Legion { 
    Warrior[] warriors; 

    public Legion() { 
     warriors = new Warrior[4]; 
     warriors[0] = new Warrior("Spartacus", 40, "I AM SPARTACUS!", 9000); 
     warriors[1] = new Warrior("Crixus", 35, "CHAMPION OF CAPUA", 8000); 
     warriors[2] = new Warrior("Gannicus", 30, "SLAYER OF VAGINAS", 8000); 
     warriors[3] = new Warrior("Alexander", 21, "I AM ALEXANDER, THE CODER", 0); 
    } 

    // getters and setters 
} 
+0

您好Juned非常感谢您的回答。我对编程相当陌生,似乎无法绕过这个“递归”错误。我以为我将索引0设置为一个新的战士构造。此外,该数组不是在一个while循环或任何东西,它如何可以recure?我刚刚注意到的这个设计的唯一问题是,每次程序进入下一个索引时,它都会向实例变量发送新值,等等。也许你可以为我贬低它? –

0

我不会重复为StackOverflow异常的原因,因为这已经被回答了(在你的构造函数中递归问题)。

但是,我认为,你可能想要的是那些创建4级特殊的战士一次而不是一个Warrior的每个实例。也许你想以某种方式让它们成为常量。

因此,也许是这样的:

public class Warrior { 

    private static final List<Warrior> MEGA_WARRIORS = 
     Collections.unmodifiableList(Arrays.asList(
      new Warrior("Spartacus", 40, "I AM SPARTACUS!", 9000), 
      new Warrior("Crixus", 35, "CHAMPION OF CAPUA", 8000), 
      new Warrior("Gannicus", 30, "SLAYER OF *censored*", 8000), 
      new Warrior("Alexander", 21, "I AM ALEXANDER, THE CODER", 0) 
     )); 

    public static List<Warrior> getMegaWarriors() { 
     return MEGA_WARRIORS; 
    } 

    private String name; 
    private int age; 
    private String call; 
    private int attackPower; 
    private String weapon; 

    public Warrior(String myName, int myAge, String myCall, int myAttackPower) { 
     name = myName; 
     age = myAge; 
     call = myCall; 
     attackPower = myAttackPower; 
     weapon = ""; 
    } 

    //Prints warriors name 
    public void name() { 
     System.out.println(name); 
    } 

    //Prints warriors age 
    public void age() { 
     System.out.println(age); 
    } 

    //Prints warriors call 
    public void warriorsCall() { 
     System.out.println(call); 
    } 

    //Prints warriors attack power 
    public void attackPower() { 
     System.out.println(attackPower); 
    } 

    //Equips warriors weapon and prints message 
    public void equip(String myWeapon) { 
     weapon = myWeapon; 
     System.out.println("Equiped the: " + weapon); 
    } 

    //Prints warriors weapon 
    public void weapon() { 
     System.out.println(weapon); 
    } 

} 
+0

谢谢。我对编程相当陌生,似乎无法绕过这个“递归”错误。我以为我将索引0设置为一个新的战士构造。此外,该数组不是在一个while循环或任何东西,它如何可以recure?我刚刚注意到的这个设计的唯一问题是,每次程序进入下一个索引时,它都会向实例变量发送新值,等等。也许你可以为我贬低它? –

+0

你知道递归是什么吗?如果没有,谷歌它。此外,尝试运行一个程序,其主编码方式如下:'public static void main(String [] args){main(args); }'。这是递归的一个非常基本的例子,它可以帮助你看到程序中发生了什么。最后,你还应该弄清楚你的'warriors'变量的目的是什么?因为即使它编码正确,一旦你的构造函数完成了,你不会在任何地方保存'warriors'变量,所以它看起来没有任何成就。 – sstan

相关问题