NullPointerException при работе с массивами - PullRequest
2 голосов
/ 09 октября 2011

Я пытаюсь создать программу для онлайн-курса по Java. Эта программа включает класс Employee и класс Name. Мне нужно создать несколько объектов Employee и предложить пользователю ввести имя сотрудника. Я храню все объекты Employee в массиве employee.

Вот код:

    //Creates employee array with the number of array elements being however many          
    //employees there are:
    Employee employee[] = new Employee [ numEmp ];

    for( int j = 0; j < numEmp; j++ )
    {
        System.out.println( "Please enter the first name of employee number "
                + ( j + 1 ) );
        Scanner input2 = new Scanner( System.in );
        String nameF = input2.nextLine();

        //This should set the employee object at employee array element "j" to the          
        //String nameF
        employee[ j ].setFirstName( nameF );

Проблема в том, что компилятор при запуске программы говорит, что последняя строка - это исключение NullPointerException. Я не уверен, что я делаю неправильно. Есть предложения?

Спасибо! -Sean

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

Вы не создаете никаких Employee объектов. Создание массива не создает никаких Employee объектов - массив не содержит объектов, он содержит ссылок , и изначально все эти ссылки равны нулю. Вам просто нужно:

employee[j] = new Employee();
employee[j].setFirstName(nameF);

Стоит очень четко понимать различия между объектами и ссылками - это влияет на все аспекты языка, от значений по умолчанию до оператора присваивания, передачи параметров, сборки мусора. Я думаю, это может быть особенно странно, если вы пришли из C ++.

3 голосов
/ 09 октября 2011

Вы создали новый массив размером numEmp, но значением по умолчанию для каждого элемента является null. Это означает, что массив изначально содержит numEmp пустых ссылок. Вам нужно использовать new для создания экземпляров каждого объекта Employee, прежде чем вы сможете вызывать методы для них.

Вы можете сделать это сразу после создания массива:

Employee employee[] = new Employee [ numEmp ];
for( int j = 0; j < numEmp; j++ )
{
    employee[j] = new Employee();
}

Или вы можете сделать это внутри существующего цикла, непосредственно перед тем, как вам сначала понадобится использовать объект:

employee[j] = new Employee();
employee[j].setFirstName(nameF);
1 голос
/ 09 октября 2011
 employee[ j ] = new Employee();
employee[ j ].setFirstName( nameF );
...