-2

ここで nullpointerexception が発生します。

    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 として正しく保存されていることがわかりました。これは、私のコードが他の部分で値を出力しているためです。コードの他の部分で同じコードを使用して従業員番号を取得していますが、例外はスローされません。ここで何が起こっているのか理解できません。同じコードがある場所では機能し、別の場所では機能しないのです。配列内の null 値を指しているわけではありません。配列の最初の値が設定されるまで、コードのこの部分に到達することはありません。

編集:配列が初期化されるコードは次のとおりです。

public class EmployeeManager{

private Employee[] employees;
private final int employeeMax = 100;
private int currentEmployees;

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

}

これは、配列内の要素の値を設定するメインによって呼び出されるメソッドです。ここで、ty は、設定する従業員のタイプを選択するためのユーザー選択です。メイン メソッドは、すべての情報を一緒にこのメソッドに送信する前に、個々の変数を要求します。

 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