29

我有一个看起来像这样的事情:

User user = userDao.Get(1);

do
{
 // processing


 // get the next user
 //
 user = UserDao.GetNext(user.Id);

 if(user == null)
       continue;   // will this work?????????????
}
while ( user != null)

如果它确实有效,它将转到 do 语句的顶部,并且 user 为空,所以事情会中断吗?

也许我应该将循环重新编写为 while 语句?

4

7 回答 7

46

continue 使其跳转到底部的评估,因此程序可以评估它是否必须继续进行另一次迭代或退出。在这种情况下,它将退出。

这是规范:http: //java.sun.com/docs/books/jls/third_edition/html/statements.html#6045

此类语言问题可以在 Java 语言规范中搜索:http: //java.sun.com/docs/books/jls/

于 2010-01-06T21:55:14.590 回答
6

这确实不是编写此代码的最佳方式。如果 user 为 null,则下次尝试获取 user.id 时将收到 NullPointerException。更好的方法是:

User user = UserDao.Get(1);
while(user != null) {
  // do something with the user
  user = UserDao.GetNext(user.id);
}
于 2010-01-06T21:55:40.893 回答
3

是的,continue将在 do..while 循环中工作。

您可能希望使用break而不是continue停止处理用户,或者只是if null continue完全删除该位,因为只要用户为空,while 循环就会中断。

于 2010-01-06T21:51:32.460 回答
3

为什么要在两个地方测试用户?当用户为空时,while 条件将终止循环,这正是您想要的。

于 2010-01-06T21:52:28.730 回答
1

简短的回答是的,继续(和中断)在 do while 循环中正常工作。

正如其他人指出的那样,从示例中看起来您可能期望继续执行错误的行为。

于 2010-01-06T21:51:40.680 回答
0

continue 将跳转到 while 内的循环评估语句,这看起来是多余的,因为您的 if 和 while 正在评估同一件事。我认为最好使用休息或简单地让 while 条件完成工作(您的 while 条件已经在为您检查)

于 2010-01-06T21:51:04.253 回答
0

让我们来看看:

$cat DoWhileContinue.java 
class DoWhileContinue {

    public static void main( String [] args ) {
        int i = 0;
        int y = 0;
        do {
            i++;
            if( i > 100 ) {
                continue;
            }
            y++;

        } while( i < 500  );
        System.out.printf("i=%d, y=%d %n", i, y );
    }
}
$javac DoWhileContinue.java 
$java DoWhileContinue
i=500, y=100 

是的,它确实。在此示例中,您可以看到yvalue 是100因为该continue语句已执行并阻止变量随后增加。

于 2010-01-06T22:02:12.347 回答