我需要在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");
}
}
}
答案 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}}