当前位置: 首页 > 知识库问答 >
问题:

Java SuperCSV CsvBeanReader尽管出错仍继续

姚臻
2023-03-14

我试图读取一个CSV文件,然后根据该CSV文件创建一个新的对象。我可以用SuperCSV库成功地做到这一点,但是如果发生错误(例如特定的单元格为null),它会抛出一个错误(如预期的那样)。我试图在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();
        }
    }

共有1个答案

屈健柏
2023-03-14

最重要的是将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;
}
 类似资料:
  • 我有一个由多个线程操作的ArrayList,由于ArrayList没有同步,所以无法工作。按照教授的指示,我把列表换成了向量。向量是同步的,但我抛出了与同步相关的异常。 为什么会发生这种情况,我如何避免代码中的并发异常?我不想只是玩玩,直到有东西起作用,我想做最好的事情。谢谢! 例外情况: 代码:

  • 我有一个组合框,我正在通过收集视图源填充。这些项目是通过传入项目类型的数据板构建的(在本例中为ProjectViewModel)。这是在WPF中。NET 4.0。 在我的窗户里。资源,我指定了以下内容: 尽管有这种风格,我仍然收到以下错误: 系统。Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,ancestor type =”System的绑

  • 我有一些(C 14)代码如下所示: 有时会抛出一个异常,这很好,因为如果是这样,我不希望垃圾映射中的值。 但是一开始我在循环中写了这个,这不起作用: 更准确地说,即使抛出异常,也会创建(并分配一个空集)。 这不是我所期望的:我希望它们以同样的方式运行。 这里有没有我误解的C原则?

  • 在我的应用程序中,我有3个活动,主要活动,次要活动和第三次活动。我希望SecondaryActivity成为Android 6上特定域的默认应用程序链接处理程序,如本指南所述。同时,我希望另一个活动TertiaryActivity能够处理来自另一个域的链接,但不是默认处理程序,因为我不拥有该域。下面是我的AndroidManifest来说明: 我阅读了这本关于应用程序链接的广泛指南,它解释了And

  • 用户应该能够将活动登录到activity_log模型中,但CreateView表单必须自动填写当前登录用户的user_id。 我已将OnetoOne关系上的djangoauth_user表扩展到另一个名为Profile(users-profile)的模型中。user_id是自动添加到我的Profile模型中的ForeignKey字段(我可以在MySQL WorkBench中看到它),并且是auth

  • 问题内容: 在我用Swift编写的SpriteKit iOS游戏中,播放非常短的声音(约0.5秒)会产生打ic(如滞后)。在其他问题中,我读到我应该发出声音,就像以前那样。 我什至使用变量()在播放之前检查声音是否准备就绪。每当播放完()时,我也会重新准备声音。以下是代码的相关部分: 我不知道我在哪里犯了错误。我感觉我已经尝试了所有方法(包括但不限于:仅准备一次,在播放后立即准备,不使用变量,而只