好的,我在这里得到一个空指针异常:
public int getIndex(int empNum)
{
int index = 0;
for(int i = 0; i < employees.length; i++)
{
int en = employees[i].getEmployeeNumber(); //Exception is at this line
if(en == empNum)
{
index = i;
}
}
return index;
}
这是它指向的代码:
public int getEmployeeNumber()
{
return employeeNum;
}
其中employeeNum 已通过以下方式定义并添加到我的数组中(此方法主要用于错误检查以确保员工编号在我指定的范围内):
public void setEmployeeNumber(int empNum)
{
Scanner sc = new Scanner(System.in);
do
{
if(empNum < 10000 || empNum > 99999)
{
System.out.println("Invalid Employee number. Choose again between 10000 and 99999.");
empNum = sc.nextInt();
}
}
while(empNum < 10000 || empNum > 99999);
employeeNum = empNum;
}
现在,我知道员工编号已正确存储为employeeNum,因为我的代码在其他部分打印出它的值就好了。我也使用相同的代码在我的代码的其他部分获取员工编号,并且不会引发异常。我不明白这里发生了什么,为什么相同的代码会在某些地方工作而不是在另一个地方工作。它没有指向数组中的空值,它永远不会到达这部分代码,直到已经设置了数组的第一个值。
编辑:这是初始化数组的代码。
public class EmployeeManager{
private Employee[] employees;
private final int employeeMax = 100;
private int currentEmployees;
public EmployeeManager()
{
employees = new Employee[employeeMax];
currentEmployees = 0;
}
这是 main 调用的方法,它设置数组中元素的值,其中 ty 是用户选择,用于选择要设置的员工类型。然后 main 方法在将所有信息一起发送到此方法之前询问每个单独的变量:
public void addEmployee(int ty, String fn, String ln, char mi, char gen, int empNum, boolean ft, double p)
{
if(ty == 1)
{
employees[currentEmployees] = new HourlyEmployee(fn, ln, mi, gen, empNum, ft, p);
currentEmployees++;
}
else if(ty == 2)
{
employees[currentEmployees] = new SalaryEmployee(fn, ln, mi, gen, empNum, ft, p);
currentEmployees++;
}
else if(ty == 3)
{
employees[currentEmployees] = new CommissionEmployee(fn, ln, mi, gen, empNum, ft, p);
currentEmployees++;
}
}
好的,我在没有初始化数组的所有元素的情况下停止了异常。我所做的是改变
for(int i = 0; i < employees.length; i++)
至
for(int i = 0; i < currentEmployees; i++)
这样它就不再将未初始化的值传递给我的方法。这样我就不必在开始时初始化数组的所有值。currentEmployees 变量是我的计数器,它告诉方法要在数组的哪个索引处添加下一个对象。