Java ArrayList堆栈溢出错误

Java ArrayList堆栈溢出错误,java,arraylist,stack-overflow,Java,Arraylist,Stack Overflow,这是我第一次问问题,请耐心等待。我正在做一项学校作业,一直在与一个堆栈溢出错误作斗争,我对这个错误了解得不够透彻。错误由~~~~表示: 堆栈跟踪中的代码部分如下所示: public class Employee extends StaffMember { public static final int DEFAULT_SIN = 123456789; public static final double MINIMUM_WAGE = 400.00; protected i

这是我第一次问问题,请耐心等待。我正在做一项学校作业,一直在与一个堆栈溢出错误作斗争,我对这个错误了解得不够透彻。错误由~~~~表示:

堆栈跟踪中的代码部分如下所示:

public class Employee extends StaffMember {
    public static final int DEFAULT_SIN = 123456789;
    public static final double MINIMUM_WAGE = 400.00;
    protected int socialInsuranceNumber = DEFAULT_SIN;;
    protected double payRate = MINIMUM_WAGE;

    /**
     * 
     */
    public Employee() {
        super();
    }

    /**
     * @param name
     * @param streetAddress
     * @param phone
     * @param socialInsuranceNumber
     * @param payRate
     */
    public Employee(String name, String address, String phone, int socialInsuranceNumber, double payRate) {
    ~~~ super(name, address, phone);
        this.socialInsuranceNumber = socialInsuranceNumber;
        this.payRate = payRate;
    }
public abstract class StaffMember extends Staff {
    public static final String DEFAULT_NAME = "Default Name";
    public static final String DEFAULT_ADDRESS = "Default Address";
    public static final String DEFAULT_PHONE = "Default Phone";

    protected String name;
    protected String address;
    protected String phone;

    /**
     * default constructor
     */
    public StaffMember() {
        super();
    }

    /**
     * 
     * @param name
     * @param address
     * @param phone
     *            abstract class can not be instantiated therefore should not
     *            have constructors
     */

    ~~~ public StaffMember(String name, String address, String phone) {
        super();
        this.name = name;
        this.address = address;
        this.phone = phone;
    }
public class Staff {

    public ArrayList<StaffMember> staffList;

    /**
     * Constructor for objects of type Staff.
     */
    public Staff() {

        staffList = new ArrayList<StaffMember>(6);

    ~~~ staffList.add(new Executive("Hilary", "203 Whitewater Line", "871-0469", 123456789, 5000, 0));
        staffList.add(new Employee("Thomas", "1000 Robson Street", "604-0000", 010203040, 1500));
        staffList.add(new Hourly("Condoleeza", "678 Fifth Ave.", "905-0690", 958473625, 18.50, 0));
        staffList.add(new Volunteer("Kimberly", "1200 West Point Grey Road", "514-8374"));
        staffList.add(new Volunteer("Jean", "321 Shawinigate Lane", "613-7282"));

    }
public class Executive extends Employee {

    private double bonus;

    /**
     * Default Constructor
     */
    public Executive() {
        super();
    }

    /**
     * @param name
     * @param address
     * @param phone
     * @param socialInsuranceNumber
     * @param payRate
     */
    public Executive(String name, String address, String phone, int socialInsuranceNumber, double payRate, double bonus) {
        super(name, address, phone, socialInsuranceNumber, payRate);
        this.awardBonus(bonus);
    }
公共类员工扩展StaffMember{
公共静态最终整数默认值为123456789;
公共静态最终双倍最低工资=400.00;
受保护的int socialInsuranceNumber=默认值;;
受保护的双倍工资率=最低工资;
/**
* 
*/
公职人员(){
超级();
}
/**
*@param name
*@param streetAddress
*@param电话
*@param socialInsuranceNumber
*@param payRate
*/
公共雇员(字符串名称、字符串地址、字符串电话、int socialInsuranceNumber、双倍工资率){
超级(姓名、地址、电话);
this.socialInsuranceNumber=socialInsuranceNumber;
这个。工资率=工资率;
}
公共抽象类StaffMember扩展Staff{
公共静态最终字符串DEFAULT\u NAME=“DEFAULT NAME”;
公共静态最终字符串DEFAULT\u ADDRESS=“DEFAULT ADDRESS”;
公共静态最终字符串DEFAULT\u PHONE=“DEFAULT PHONE”;
受保护的字符串名称;
受保护的字符串地址;
保护串电话;
/**
*默认构造函数
*/
公职人员(){
超级();
}
/**
* 
*@param name
*@param地址
*@param电话
*抽象类无法实例化,因此不应
*有建设者
*/
~~~公共职员成员(字符串名称、字符串地址、字符串电话){
超级();
this.name=名称;
this.address=地址;
this.phone=电话;
}
公营班主任{
公共阵列列表;
/**
*类型为Staff的对象的构造函数。
*/
公职人员(){
staffList=新阵列列表(6);
添加(新主管(“希拉里”、“203白水线”、“871-0469”、“123456789、5000、0”);
添加(新员工(“托马斯”,“罗布森街1000号”,“604-0000”,0102030401500”);
添加(新的小时(“康多莉扎”,“第五大道678号”,“905-0690”,958473625,18.50,0));
添加(新志愿者(“金伯利”、“西点灰路1200号”、“514-8374”);
添加(新志愿者(“Jean”,“Shawinigate巷321号”,“613-7282”);
}
公共类主管扩展员工{
私人双倍奖金;
/**
*默认构造函数
*/
公共行政人员(){
超级();
}
/**
*@param name
*@param地址
*@param电话
*@param socialInsuranceNumber
*@param payRate
*/
公共行政人员(字符串名称、字符串地址、字符串电话、国际社会保险号码、双倍工资、双倍奖金){
超级(姓名、地址、电话、社会保险号码、付款率);
这个。奖励奖金(奖金);
}

对象的循环实例化导致堆栈溢出

Staff
构造函数中,您正在实例化许多类,例如
Executive
Employee
。您的
Executive
类扩展了
Employee
类和
Employee
类扩展了
StaffMember

当您这样做时,
Staff
的构造函数将再次被隐式调用(从
Executive
调用
super()
,然后是
Employee
,然后是
StaffMember
),并重复整个过程,从而消耗所有内存。
摆脱
扩展Staff
的类可能会解决您的问题(问题可能是
扩展
来自
StaffMember
,这是调用链上的最后一个)。

有一个循环的构造函数调用链。 您的基类构造函数
Staff()
正在实例化子类,子类反过来调用自构造函数,导致无限链,从而导致
stackOverFlow
错误

另外,
StaffMember
扩展
Staff
似乎是不正确的。因为Staff是由所有员工组成的全体员工,
StaffMember
代表单个员工。两者之间没有
关系


你应该从StaffMember中删除
扩展Staff
,然后代码也应该可以正常工作。

你的类A的构造函数调用类B的构造函数。类B的构造函数调用类A的构造函数。你有一个无限递归调用,这就是为什么你最终会有一个
堆栈溢出错误我们将进入一个构造函数的循环调用


Java支持类之间存在循环依赖关系,这里的问题只与构造函数相互调用有关。

请添加错误日志。您没有粘贴所有代码。我看不到awardBonus方法。