【问题标题】:Java SuperCSV CsvBeanReader Continue Despite Error尽管出现错误,Java SuperCSV CsvBeanReader 仍继续
【发布时间】:2017-10-14 21:53:46
【问题描述】:

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

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

【问题讨论】:

    标签: java loops csv supercsv


    【解决方案1】:

    最重要的是将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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2013-02-10
      • 2012-09-16
      • 1970-01-01
      • 2015-03-25
      相关资源
      最近更新 更多