2015-08-29 6 views
0

J'ai essayé d'importer un fichier csv (contenant des champs vides) en sélectionnant le fichier avec un filechooser dans ma base de données. Utiliser le filechooser est important car c'est un programme à utiliser par une école et ils veulent pouvoir importer leurs nouveaux dossiers d'étudiants chaque année en important le fichier excel/csv qu'ils ont. Chaque fois que je cours le code donné ci-dessous je reçois l'erreur suivante:Java: l'importation de csv contenant des champs vides donne NullPointerException

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

Question est évident je pense. Comment puis-je le faire fonctionner sans l'erreur?

classe Importateur:

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; 
} 
} 

code dans l'interface graphique lorsque le bouton d'importation est pressé:

@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) 
    { 

    } 
} 

code dans le référentiel:

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

Exemple de fichier csv je tente de importez de cette façon: Comme vous pouvez le voir l'email est vide la plupart du temps (c'est pour un kinderga école primaire) mais pour certains c'est donné.

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

constructeur étudiant ressemble à ceci

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

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

Stack trace? Exception? Ligne jeté à? – EJP

Répondre

0

Comment le constructeur étudiant regarde? J'ai du mal à trouver dans les javadocs ce que readNext() met dans la référence de chaîne s'il n'y a rien entre les délimiteurs. Il pourrait s'agir d'une chaîne vide ou d'une valeur nulle (ce qui semble être le cas). Dans ce cas, il se peut que ce que vous faites dans le constructeur Student avec cette valeur ne soit pas légal avec une valeur nulle.

EDIT

si tel est le cas, vous pouvez soit gérer le passage d'une valeur nulle dans le constructeur ou peut-être écrire une méthode statique qui serait quelque chose comme:

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

et quand instancier un étudiant faire:

new Student(Convert(nextLine[3]), ...); 
+0

Ajout du code du constructeur de l'étudiant à la question. Également essayé la méthode de conversion, mais toujours la même erreur – user2270715