构造函数不创建对象 - Java

时间:2014-02-19 20:15:49

标签: java object constructor

我已经在我的一个程序中与这个问题搏斗了大约一个星期了,我不知道我做错了什么。 对于这项任务,我基本上是使用3种不同类型的员工(佣金,工资,每小时)制作一系列Employee对象。所有三个子类都扩展了Employee类,这是抽象的。

这是我的代码,它调用每个类类型的构造函数:

    public boolean addEmployee(int empType, String first, String last, char mi, char gen, int empNum, boolean full, double amount)
    {
    employeeCount += 1;

    if (employeeCount > EMPLOYEES_MAX) {
        System.out.println("ERROR: ARRAY FULL. UNABLE TO ADD NEW EMPLOYEE");
        return false;
    }

    else {
        switch (empType) {
            case 1:
            employees[employeeCount] = new HourlyEmployee(first, last, mi, gen, empNum, full, amount);
            break;

            case 2:
            employees[employeeCount] = new SalaryEmployee(first, last, mi, gen, empNum, full, amount);
            break;

            case 3:
            employees[employeeCount] = new CommissionEmployee(first, last, mi, gen, empNum, full, amount);
            break;
        }
        return true;
    }
}

这里是薪水员工的构造函数,其他2个与此相同。

public class SalaryEmployee extends Employee
{
private double salary;

public SalaryEmployee(String first, String last, char midInit, char gen, int empNum, boolean full, double sal)
{
    super(first, last, midInit, gen, empNum, full);
    salary = sal;
}

我编写的超级构造函数由此构造函数调用:

abstract class Employee
{
protected String firstName;
protected String lastName;
protected char middleInitial;
protected boolean fullTime;
protected char gender;
protected int employeeNum;

public Employee(String first, String last, char midInit, char gen, int empNum, boolean full)
{
    firstName = first;
    lastName = last;
    middleInitial = midInit;
    employeeNum = empNum;
    fullTime = full;

    switch (gen) {
        case 'M': case 'F': 
        case 'm': case 'f':
        gender = gen;
        break;

        default:
        gender = 'F';
    }
}

正如我之前所说的那样,我不知道为什么它不能像它那样创造对象。每当我打印出数组或对其进行排序时,我总是得到null或空指针异常。

非常感谢任何帮助,非常感谢你们!

编辑:

好的,这是我的Employee数组初始化的地方。

public class EmployeeList
{
private final int EMPLOYEES_MAX = 50;
private Employee employees[];
private int employeeCount;

public EmployeeList()
{
    employees = new Employee[EMPLOYEES_MAX];
    employeeCount = 0;
}

当我运行它时,它仍然通过构造函数,因为默认方法没有运行,我只是因为一些奇怪的原因而得到null。下面是输出:

从以下选项中进行选择:         1添加员工         2按类型子菜单处理员工         3删除员工         4对员工进行排序         5计算每周支付         6计算奖金         7年度加薪         8重置周         0退出         选项:1

  1. 每小时
  2. 薪酬
  3. 委员会 输入选择:1
  4. 输入姓氏:Doe

    输入名字:Jane

    输入Middle Initial:M

    输入性别:F

    输入员工编号:1

    全职? (y / n):y

    输入工资:14

    员工已添加到列表

    主菜单

    null来自我调用listAll()方法的主类,它应该列出数组中的所有内容。但只是返回null。

    再次编辑:

    所以这是列出所有内容的方法。

        public void listAll()
    {
        for(int x = 0; x < employeeCount; x++)
            System.out.println(employees[x]);
    }
    

    感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

第一个问题

您传递了int empType,然后启用了employeeType

第二个问题

您传递了int empType,但您的切换中的所有案例都是char,例如case '1':

编辑:您编辑了问题以解决一些问题&gt;: - /

第三个问题

listAll()方法中,您正在尝试打印没有toString()方法的对象。为您的抽象Employee类提供一个toString()方法,如下所示。

public String toString() {
    return lastName + ", " + firstName + " " + middleInitial;
}

现在,假设您希望您的子类具有更详细的表示,例如“ Smith,John C.每小时。”您可以通过向每个类添加另一个toString方法来实现此目的。你的孩子课程,但你可以重用你已经写过的部分!例如,这将在您的每小时员工班级中进行。

public String toString() {
    return super.toString() + " is hourly.";
}

答案 1 :(得分:1)

有些事情浮现在脑海中,但大多数都是关于整体设计,而不是您的具体问题。

Off By One

代码在包含off by one error时的样子。您正在将employeeCount初始化为0,但在第一次插入之前将其递增到1。因此,第一个员工进入employees[1]第二个数组广告位。

但是你的输出循环是正确的,在第一次插入后,它只输出employees[0],它仍然是null。只需将employeeCount += 1;移动到方法的末尾,就可以了。

(如果不清楚:Java将数组索引从0计算到length-1。)

IndexOutOfBounds

还有另一个错误。您正在比较employeeCount > EMPLOYEES_MAX。如果employeeCount = EMPLOYEES_MAX,它会通过测试,但在employees[EMPLOYEES_MAX]处插入将失败,因为它超出了数组的范围。

您需要检查employeeCount >= EMPLOYEES_MAX。这可能看似违反直觉,因为在您的方法中,您将其用作“插入后的员工数”。如果您从上面包含我的更正,则解释是“已插入的员工数量”

答案 2 :(得分:0)

case '1'更改为case 1,依此类推,当您传入int时,您显然不希望打开char值。

答案 3 :(得分:0)

到目前为止,我已经加入了你所写的内容并且看起来它的工作原理(为代码可读性而引入的常量):

public class EmployeeList {

public static final int EMP_TYPE_HOURLY = 1;
public static final int EMP_TYPE_SALARY = 2;
public static final int EMP_TYPE_COMMISSION = 3;
public static final char EMP_GEN_MALE = 'M';
public static final char EMP_GEN_FEMALE = 'F';

private int employeeCount = 0;
private static final int EMPLOYEES_MAX = 5;
private Employee[] employees = new Employee[EMPLOYEES_MAX];

public boolean addEmployee(int empType, String first, String last, char mi, char gen, int empNum, boolean full, double amount) {
    employeeCount += 1;

    if (employeeCount > EMPLOYEES_MAX) {
        System.out.println("ERROR: ARRAY FULL. UNABLE TO ADD NEW EMPLOYEE");
        return false;
    } else {
        switch (empType) {
            case EMP_TYPE_HOURLY:
                employees[employeeCount] = new HourlyEmployee(first, last, mi, gen, empNum, full, amount);
                break;

            case EMP_TYPE_SALARY:
                employees[employeeCount] = new SalaryEmployee(first, last, mi, gen, empNum, full, amount);
                break;

            case EMP_TYPE_COMMISSION:
                employees[employeeCount] = new CommissionEmployee(first, last, mi, gen, empNum, full, amount);
                break;
        }
        return true;
    }
}

public Employee[] getEmployees() {
    return employees;
}

public static void main(String[] args) {
    EmployeeList empList = new EmployeeList();

    empList.addEmployee(EMP_TYPE_HOURLY, null, null, 'A', EMP_GEN_MALE, 555, true, 100.0);
    empList.addEmployee(EMP_TYPE_HOURLY, null, null, 'A', EMP_GEN_FEMALE, 555, true, 100.0);
    empList.addEmployee(EMP_TYPE_SALARY, null, null, 'A', EMP_GEN_FEMALE, 555, true, 100.0);
    empList.addEmployee(EMP_TYPE_COMMISSION, null, null, 'A', EMP_GEN_FEMALE, 555, true, 100.0);

    for (int i = 0; i < EMPLOYEES_MAX; i++) {
        System.out.println("" + empList.getEmployees()[i]);
    }
}

}