我已经在我的一个程序中与这个问题搏斗了大约一个星期了,我不知道我做错了什么。 对于这项任务,我基本上是使用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
输入姓氏: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]);
}
感谢您的帮助!
答案 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 error时的样子。您正在将employeeCount
初始化为0
,但在第一次插入之前将其递增到1
。因此,第一个员工进入employees[1]
的第二个数组广告位。
但是你的输出循环是正确的,在第一次插入后,它只输出employees[0]
,它仍然是null
。只需将employeeCount += 1;
移动到方法的末尾,就可以了。
(如果不清楚:Java将数组索引从0
计算到length-1
。)
还有另一个错误。您正在比较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]);
}
}
}