抛出异常而不破坏java中的循环

时间:2016-02-24 11:51:34

标签: java exception-handling

我需要在java内部循环中处理自定义异常,所以我抛出了新的自定义异常,但它打破了循环。如何在不破坏循环的情况下设法抛出循环。这是我的代码

    for (int i = 0; i < j; i++) {
        File currFile = arrayOfFile1[i];
        if (currFile.isFile()) {
            if (currFile.exists()) {
                try {
                    String fileName = currFile.getName();
                    if (fileName.startsWith("~$")) {
                        continue;
                    } else {
                        if ((fileName.endsWith(".xlsx")) || (fileName.endsWith(".xls"))) {
                            if (fileName.endsWith("_arch.xlsx") || fileName.endsWith("_arch.xls")) {
                                continue;
                            }
                            try {
                                IDSOutputGenerator.generateOutput(currFile.getAbsolutePath(), "", outputType,
                                        false);
                            } catch (CheckErrorHandle e) {
                                throw new CheckErrorHandle();
                            }
                        }
                        else if (fileName.endsWith(".xml")) {
                            try {
                                IDSOutputGenerator.generateOutput(currFile.getAbsolutePath(), "", outputType,
                                        false);
                            } catch (CheckErrorHandle e) {
                                throw new CheckErrorHandle();
                            }

                        } else {
                            throw new CheckErrorHandle(currFile.getAbsolutePath(), "File type not supported");
                        }
                    }
                } catch (CheckErrorHandle e) {
                    throw new CheckErrorHandle();
                } catch (Exception e) {
                    throw new CheckErrorHandle("", e.getMessage());
                }
            } else {
                throw new CheckErrorHandle(currFile.getAbsolutePath(), "File does not exist");
            }
        }
    }

2 个答案:

答案 0 :(得分:5)

类似的东西:

Exception ex = null;
for (;;) {
    ex = new Exception();
}
if (ex != null) throw ex;

或者,正如评论所暗示:

List<Exception> errors = new ArrayList<>();
for (;;) {
    errors.add(new Exception());
}
if (!errors.isEmpty()) {
    //Do something with errors
}

一般的想法是,你唯一可以做的事情 - 在投掷之前将异常存储在某个地方。如果你抛出异常 - 那么只有避免破坏循环的方法就是立即捕获它。

答案 1 :(得分:0)

一种可能性 - 将循环的整个主体移动到另一个处理异常的方法而不重新抛出:

e.g。

for (int i = 0; i < j; i++) {
    File currFile = arrayOfFile1[i]; 
    if (handlefile(currFile)) {
       //do something on success
    } else {
       //do something on failure
    }
}

和方法:

private boolean handleFile(File file) {
  try {
    //do stuff
    return true;
  } catch (Exception e) { //or more specific exceptions/multi-catch
     //log exception
     return false;
  }
}

另一种可能性是使上述方法返回布尔成功标志:

循环:

{{1}}

方法:

{{1}}