-2

好的,我在这里得到一个空指针异常:

    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 变量是我的计数器,它告诉方法要在数组的哪个索引处添加下一个对象。

4

1 回答 1

1
int en = employees[i].getEmployeeNumber(); //Exception is at this line

确保初始化employees数组中的所有元素。

您只是初始化employees了数组,但没有初始化它的元素。

public EmployeeManager()
{
    employees = new Employee[employeeMax];

    for(int i = 0; i< employees.length; i++) {
        // initialize elements
        employees[i] = // new Employee();
    }
    currentEmployees = 0;

}
于 2013-10-01T02:03:41.137 回答