如何创建一个try-catch块继续调用对象上的方法,直到没有更多的异常要捕获

ape*_*son 1 java loops try-catch try-catch-finally

基本上遍历列表和
- 第一个对象上的Invoke方法
- 捕获第一个异常(如果有的话); 如果没有更多的例外可以捕获,请正常返回.否则,继续调用方法,直到捕获到所有异常.
- 转到下一个对象.

我可以迭代每个对象,调用方法,并捕获一个异常,但我不知道如何不断调用它上面的方法并继续捕获异常.

eri*_*son 6

这与其他答案类似,但没有旗帜,这对我来说似乎很混乱.我不太明白这个问题,所以我只是把它扔出去,以防它有用.

for (Item item : items) {
  while (true) {
    try {
      item.doSomething();
      break;
    } catch (MyException ex) {
      log.warn("Something failed.", ex);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这种方法取决于未标记break语句的操作,该语句突然完成,然后while通常退出封闭语句.


基于后续的评论,我认为当声明由方法抛出多个异常时,它有什么意思.

每次调用方法都可以通过抛出一个异常来终止.你不能以某种方式恢复它停止的调用,并处理后续的异常.

因此,如果方法抛出多个异常,请捕获一个共同的祖先,然后继续前进.例如,如果方法抛出java.io.EOFException 或者 java.nio.channels.ClosedChannelException,您可以简单地捕获,java.io.IOException因为它是一个共同的祖先.(你也可以捕获java.lang.Exceptionjava.lang.Throwable出于同样的原因.)在相同的条件下再次调用该方法将不会让你更进一步.

如果要尝试在每个对象上调用该方法,即使某些对象失败,也请使用:

for (Item item : items) {
  try {
    item.doSomething();
  } catch (Exception ex) { /* This could be any common ancestor. */
    log.warn("Something failed.", ex);
  }
}
Run Code Online (Sandbox Code Playgroud)