Java SuperCSV CsvBeanReader 尽管出现错误仍继续

标签 java loops csv supercsv

我正在尝试读取 CSV 文件,然后根据该 CSV 文件创建一个新对象。我可以使用 SuperCSV 库成功地做到这一点,但如果发生错误(例如特定单元格为空),它会抛出错误(如预期)。我试图收集 ArrayList 中的所有错误,但现在出现第一个异常时,一切都会停止。即使处理器出现错误,如何让 SuperCSV CsvBeanReader 继续下一行?我在 try/catch block 内有循环条件。代码如下:

ArrayList<Duplicate> duplicates = new ArrayList<Duplicate>();
ArrayList<BadProperty> invalidProperties = new ArrayList<BadProperty>();

File convFile = new File(file.getOriginalFilename());
convFile.createNewFile();
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();

ICsvBeanReader beanReader = null;
try {
    beanReader = new CsvBeanReader(new FileReader(convFile), CsvPreference.STANDARD_PREFERENCE);

    final String[] header = beanReader.getHeader(true);
    final CellProcessor[] processors = getProcessors();

    Property property;
    while ((property = beanReader.read(Property.class, header, processors)) != null) {
            // logic in here


        }
    }
    catch(SuperCsvException e) {
        invalidProperties.add(new BadProperty(e.getCsvContext()));
        System.out.println(e);

    }
    finally {
        if( beanReader != null ) {
            beanReader.close();
        }
    }

最佳答案

最重要的是将try catch移到循环内部,这样当异常发生时循环不会停止。这是我的做法

private void readProperties()
{
  try
  {
    beanReader = new CsvBeanReader(new FileReader(convFile), CsvPreference.STANDARD_PREFERENCE);

    while (readNextProperty())
    {
    }
  }
  catch (Exception e)
  {   
  }
  finally
  {
    if(beanReader != null)
    {
      beanReader.close();
    }
  }
}

/** Returns true when there are more properties to read. */
private boolean readNextProperty()
{
  try
  {
    Property property = beanReader.read(Property.class, header, processors);
    if (property == null)
    {
      return false;
    }

    // logic in here

  }
  catch (SuperCsvException e)
  {
    invalidProperties.add(new BadProperty(e.getCsvContext()));
    System.out.println(e);
  }

  return true;
}

关于Java SuperCSV CsvBeanReader 尽管出现错误仍继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46749706/

相关文章:

java - 在 linux 服务器上运行用 java 编写的计划任务

java - 当Java中的谐波级数达到指定目标时,如何停止对其求和?

java - 从/向路径读取和写入 CSV

javascript - 将变量从#each 循环传递给助手 emberjs

file - 使用 Spring 从 csv 文件读取数据运行测试

Python-从特定列号写入csv

java - 计算最后一列素数

java - Elasticsearch查询聚合spring框架elasticsearsh如何?

java - Solr 3.4 和 Httpclient 4

python - 获取 "for"循环以从列表中删除字符(如果它们相等)