【问题标题】:Java: importing csv containing empty fields gives NullPointerExceptionJava:导入包含空字段的 csv 会产生 NullPointerException
【发布时间】:2015-08-29 17:20:37
【问题描述】:

我一直在尝试通过将带有文件选择器的文件选择到我的数据库中来导入 csv 文件(包含空字段)。使用文件选择器很重要,因为它是一个供学校使用的程序,他们希望能够通过导入他们拥有的 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;
}
}

按下导入按钮时的 GUI 代码:

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

【问题讨论】:

  • 堆栈跟踪?例外?线扔在哪里?

标签: java csv import field filechooser


【解决方案1】:

Student 构造函数的外观如何?如果分隔符之间没有任何内容,我很难在 javadocs 中找到值 readNext() 放在字符串引用中的内容。它可能是一个空字符串或一个 null(它似乎是)。在这种情况下,可能是您在 Student 构造函数中使用该值执行的操作对于 null 值是不合法的。

编辑

如果是这种情况,您可以在构造函数中处理空值的传递,或者编写一个类似于以下内容的静态方法:

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

当实例化一个学生时:

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

【讨论】:

  • 在问题中添加了学生构造函数代码。也尝试了转换方法,但仍然是同样的错误
猜你喜欢
  • 1970-01-01
  • 2015-02-08
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多