Java: импорт csv, содержащего пустые поля, дает NullPointerException

Я пытался импортировать CSV-файл (содержащий пустые поля), выбрав файл с помощью FileChooser в свою базу данных. Использование Filechooser важно, так как это программа, которую будет использовать школа, и они хотят иметь возможность импортировать свои новые студенческие записи каждый год, импортируя имеющийся у них файл excel/csv. Всякий раз, когда я запускаю приведенный ниже код, я получаю следующую ошибку:

SEVERE: null
java.lang.NullPointerException
at gui.FXMLStudentController$1.run(FXMLStudentController.java:86)
at java.lang.Thread.run(Thread.java:745)

Вопрос очевиден, я думаю. Как заставить работать без ошибок?

Класс импортера:

public class ImportStudents
{
private File file;
private List<Student> students = new ArrayList<>();

public ImportStudents(File file) throws IOException 
{
    this.file = file;
}

public List importStudents() throws FileNotFoundException, IOException
{
   try(CSVReader reader = new CSVReader(new FileReader(file), ';'))
   {
   String[] nextLine;
   boolean notFirst = false;
   while ((nextLine = reader.readNext()) != null) {
        if (notFirst) {

             students.add(new Student(nextLine[3], nextLine[1], nextLine[0],nextLine[2]));
        }
        notFirst = true;
    }

   }catch(Exception e)
           {
               e.printStackTrace();
           }
    return students;
}
}

Код в графическом интерфейсе при нажатии кнопки импорта:

   @FXML
private void importeer(ActionEvent event)
{

    Stage stage = new Stage();
    ImportStudents = importStudents; //importStudents created earlier in the class
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open File");
    try
    {
        importStudents = new ImportStudents(fileChooser.showOpenDialog(stage));
        new Thread(new Runnable() {

            @Override
            public void run() 
            {
                try
                {
                    repository.importStudents(importStudents.importeerLeerlingen());
                }
                catch(Exception e)
                {
                    Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, e);
                }
            }
        }).start();

    }
    catch(Exception e)
    {

    }
}

Код в репозитории:

  public void importStudents(List<Student> students)
{
    try{
        em.getTransaction().begin();
        for (Student : students) 
        {
           em.persist(student);
        }
        em.getTransaction().commit();
    }
    finally
    {
        em.close();
    }
}

Пример из csv-файла, который я пытаюсь импортировать следующим образом: Как вы видите, электронная почта в большинстве случаев пуста (это для детского сада), но для некоторых она предоставляется.

 SurName;Name;E-mail;Class
 Agacseven;Tuana;;3KA
 Ahmedov;Arman;;2KC
 Akcan;Efe;;3KA
 Akcan;Hanzade;;2KC
 Akhtar;Hussain;;1KA

Студенческий конструктор выглядит так

public Student(String class, String name, String surNaam, String email) 
{

    this.class = class;
    this.name = name;
    this.surNaam = surNaam;
    this.email = email;
}

person user2270715    schedule 29.08.2015    source источник
comment
Трассировки стека? Исключение? Линия брошена?   -  person user207421    schedule 30.08.2015


Ответы (1)


Как выглядит конструктор Student? Мне трудно найти в javadocs, какое значение readNext() помещает в ссылку на строку, если между разделителями ничего нет. Это может быть либо пустая строка, либо нуль (что кажется). В этом случае может случиться так, что то, что вы делаете в конструкторе Student с этим значением, недопустимо с нулевым значением.

ИЗМЕНИТЬ

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

public static String Convert(String str) {
    return str == null ? "" : str;
}

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

new Student(Convert(nextLine[3]), ... );
person CrookedBadge    schedule 29.08.2015
comment
В вопрос добавлен код конструктора учащегося. Также попробовал метод преобразования, но все та же ошибка - person user2270715; 30.08.2015