【问题标题】:Continue executing loop after catching an exception in try/catch block在 try/catch 块中捕获异常后继续执行循环
【发布时间】:2023-03-20 09:34:02
【问题描述】:

如果while (iterator.hasNext())发生异常,如何继续迭代循环?

所以我想做下面这样的事情。

            try {
                loop: while (iterator.hasNext())  // as excetion is on this line excetion will be catch by catch_2
                {
                    try {
                        Result res = (Result) iterator.next();
                        list.add(res);
                    } catch (Exception e) {                    // catch_1
                        e.printStackTrace();
                    }
                }
            } catch (Exception e) {                            // catch_2
                // goto start of the loop
                continue loop;
            }

Iterator<UserProvisioning> iterator = beans.iterator();
            while (iterator.hasNext()) {
                try {
                    UserProvisioning userProvisioning = (UserProvisioning) iterator.next();
                    System.out.println(userProvisioning.getFIRST_NAME());
                    list.add(userProvisioning);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    logger.error("Error occured...)
                }
            }

根据我的理解,iterator.hasNext() 尝试通过将 csv 记录列映射到 POJO 字段来检查下一个元素是否存在,并且由于 csv 记录标题中存在无效数据,因此计数与记录文件不匹配,因此错误

java.lang.RuntimeException: com.opencsv.exceptions.CsvRequiredFieldEmptyException: Number of data fields does not match number of headers.

所以我正在尝试记录错误并继续迭代下一条记录。

编辑 iterator.hasNext() 应该返回 true 或 false 但它的抛出错误

【问题讨论】:

  • 有什么用?您想将异常抛入无穷大吗?例如:迭代器为空,您希望您的日志显示数以百万计的 NPE 被记录吗? (你甚至不记录它们)
  • 请查看更新后的问题
  • 为什么hasNext会抛出异常?我从来没有看到过迭代器的定义。
  • @suiwenfeng 不,我在异常记录之后有下一个元素(记录),并且由于异常之后有记录,这意味着 hasNext() 应该检查结果是否不为空(并返回 true)
  • 不,hasNext 应该返回 true 或 false,没有异常。

标签: java loops exception try-catch


【解决方案1】:

如果您在循环中放置一个 try-catch 块,它将继续循环到最后,除非您中断它

for(Iterator<UserProvisioning> iter = beans.iterator(); iter.hasNext();) {
  try{
    UserProvisioning userProvisioning = iter.next();
    System.out.println(userProvisioning.getFIRST_NAME());
    list.add(userProvisioning);
  } catch(Exception ex) {
    logger.warn("An issue occurred when looping through user provisionings: " + ex.getMessage());

  }
}

上面的代码将设置一个迭代器并循环遍历它。如果发生异常,它将记录并继续循环,因为没有调用 break

因为你告诉了迭代器是什么类型,所以当你调用iter.next()时不需要强制转换它

【讨论】:

  • 假设 CSV 中总共有 10 行,错误在第 3 行,然后上面的代码记录第 3 行的错误,并且对于第 4 个 csv 记录,循环不会继续。
  • 上述代码将继续到第 4 条 CSV 记录,除非某些东西实际上是抛出 ​​Error 而不是 Exception,其中将 Exception 更改为 Throwable
  • 自我回答以来,您添加了更多上下文,但 iter.next()try-catch 块内,因此如果它无法调用 next,它仍将继续;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2020-07-01
  • 2011-02-07
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多