Java 在do中处理try/catch异常的最佳方法。。。while()评估?

Java 在do中处理try/catch异常的最佳方法。。。while()评估?,java,exception-handling,try-catch,do-while,Java,Exception Handling,Try Catch,Do While,在这种情况下: Cursor cursor = dbHandler.fetchEvents(); boolean someBool = true; do { someStuff(); variables = things; otherStuff(); } while (someBool && cursor.moveToNext()); cursor.moveToNext()可能会引发许多异常,特别是当我在使用光标时数据库意外关闭时 处理while()计

在这种情况下:

Cursor cursor = dbHandler.fetchEvents();
boolean someBool = true;

do {
    someStuff();
    variables = things;
    otherStuff();
} while (someBool && cursor.moveToNext());
cursor.moveToNext()可能会引发许多异常,特别是当我在使用光标时数据库意外关闭时

处理while()计算中抛出的任何可能异常的最佳方法是什么?目前,整个事情只是崩溃了。我宁愿避免那样。编译器不喜欢我将try/catch直接添加到while()eval中,这太难看了。我想我需要创建一种新方法来实现这一点:

private boolean moveToNext(cursor) {
    boolean result = false;
    try {
        result = cursor.moveToNext();
    } catch (Exception e) {
        ... error handling ...
    }
    return result;
}
然后将我的评估循环更改为:

Cursor cursor = dbHandler.fetchEvents();
boolean someBool = true;

do {
    someStuff();
    variables = things;
    otherStuff();
} while (someBool && moveToNext(cursor));

有人有其他建议吗?如果是的话,我很想听他们说。谢谢

将整个代码块放在try/catch块中,当您失去数据库连接时,该块将被捕获


然后,您需要重新调查整个块,看看清理什么是有意义的,这将为您提供try/catch的“catch块”的内容。一旦你这样做了,你可能会注意到你的真实代码有了进一步的改进,这可能会使你发布的这个例子变得不那么重要,因为你只关注你所关心的事情。

这实际上取决于你遇到错误时希望发生什么。当您得到异常时,您应该跳过循环的那个迭代并继续到下一个,还是干脆停止迭代?或者整个循环都坏了,你需要告诉你的用户出了什么问题

如果您真的关心单独处理循环的每个迭代,那么您的方法将很好地工作。或者,如果只想检测整个循环是否遇到错误,则可以将整个循环包装在一个try块中:

try {
   Cursor cursor = dbHandler.fetchEvents();
   boolean someBool = true;

   do {
        someStuff();
        variables = things;
        otherStuff();
   } while (someBool && cursor.moveToNext());
} catch (Exception e) {
  //report to the user that the loop failed
}

您始终可以将
while()
中的代码移动到循环体,这没什么大不了的

while(true)
{

    ...
    if( ! someBool )
        break;
    if( ! cursor.moveNext() )
        break;
}

然后用您喜欢的任何代码围绕它。

您建议的解决方案正是我建议的。我建议将
返回结果
移动到try或finally中。如果使用try/catch,try/catch/finally应该是最重要的作用域,try块中包含业务逻辑,catch块中包含错误处理,以及无论finally块中是否存在错误都希望发生的任何事情那是不是如果有人true或游标。moveToNext()!=没错,这个循环已经完成,不需要其他任何事情。整个块超过了300行(我没有写),但我认为将对它的调用封装在try/catch中是防止崩溃的最后一搏。@AWT异常不仅仅是为了防止崩溃。它们用于向用户或调用代码报告链上的错误。你需要问自己的问题是,你需要什么样的信息来传递这条链——你只需要停止循环吗?您需要报告循环的特定迭代吗?还是只需要报告循环遇到错误?这一点很好。在这种情况下,防止崩溃是我最关心的问题。其次是干净地终止这个循环,并让调用者知道它已经完成了。调用代码有逻辑来处理这一切的计算结果是真是假,我只是保留了其中的大部分以便于阅读。