java - 为什么我的数组中的索引 0 出现 stackoverflow 错误

标签 java stack-overflow

这是我的战士职业。我希望这个类(class)有一群战士。 这个想法是能够调用这样的方法 --> Warriors.select(1) ,它将在索引 1 处创建战士。希望这是有道理的。 请向我解释为什么会发生此错误。

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);
    }

}

最佳答案

当您递归调用它时,您的构造函数正在运行无限循环。检查构造函数中的这些行:

    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);

对于每个 Warrior 数组项实例化,您调用相同的构造函数,该构造函数再次尝试创建数组并初始化项,这种情况会一直持续下去,直到堆栈溢出。

更好的设计策略是创建一个新类,例如 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
}

关于java - 为什么我的数组中的索引 0 出现 stackoverflow 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374102/

相关文章:

string - t和*t的区别

c# - XDocument 更改所有属性名称

java - Hadoop:应该映射什么,应该减少什么?

java - Hibernate 查询(不是 SQL)日志记录

java - 无法将 Spring 方面设置为最低顺序

java - 哈希表中的冲突解决

java - 如何在 hibernate 中调用程序?

c++ - .NET 异常处理程序在 Visual C++ 6.0 异常中导致堆栈溢出

java - GUI 关闭问题?

Java 以不同方式编译代码/变量在存在 if 语句时未初始化