do while循环中continue语句是否有效?

32

我有一个 do while 循环看起来像:

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 是 null,所以事情会出错吗?
也许我应该将循环改为 while 语句?

42
你为什么不试一下呢?这肯定比写问题更快... - meriton
2
看起来有些奇怪。你应该简化这段代码。你想要做什么?获取第一个非空用户?还是处理所有非空的用户?如何确定没有更多的用户了呢?(do/while 表示 null 代表用户结束...但 if..continue 意味着中间可能存在 null 用户... :S) - helios
meriton:我曾经也这么想过,但有时候这些人此刻可能没有编译器在他们的电脑上(虽然这不一定是这种情况...) - Noon Silk
1
有趣的谜题,但在实践中我从不使用do-while循环。有点争议的是,我也从不使用continue。 - Michael Easter
10
谷歌搜索并找到这个问题比编写代码快得多...很幸运Mrblah提出了这个问题而不是直接尝试它! - antak
3
人们似乎不理解stackoverflow的理念。这个问题不仅有助于Mrblah,还可能帮助数百名谷歌搜索者。尽管这可能是一个可悲的例子,但Meriton的论点完全无效。 - phil294
7个回答

54

我可以评论一下这是一种奇怪的行为。因为do while循环在评估条件之前执行一个动作是被期望的。 - user13947194
并不奇怪。“控制传递到迭代语句的循环继续点” - 循环评估一个条件,其中一部分是“continue”,执行 continue,并将控制传递到循环继续点,即条件评估。在我看来,这是合法的。 - Oleksii Karnatskyi

5

这并不是编写代码的最佳方式。如果用户为null,下一次尝试获取user.id时,您将会得到一个NullPointerException。更好的方法是:

User user = UserDao.Get(1);
while(user != null) {
  // do something with the user
  user = UserDao.GetNext(user.id);
}

4

是的,在 do..while 循环中,continue 会起作用。

你可能想使用 break 来停止处理用户,或者干脆完全删除 if null continue 部分,因为只要用户为空,while 循环就会自动退出。


3

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


1

简短的回答是,continue(和break)在do while循环中可以正常工作。

正如其他人指出的那样,从示例中看来,您可能对continue期望的行为有所误解。


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 

是的,它确实如此。在这个示例中,您可以看到y的值为100,因为执行了continue语句,防止变量在之后被增加。


0

continue 语句将跳转到 while 循环内的循环评估语句,这看起来有些冗余,因为您的 if 和 while 正在评估相同的内容。我认为最好使用 break 或者简单地让 while 条件完成工作(您的 while 条件已经为您检查了它)。


2
continue 语句表示在不执行循环体其余部分的情况下继续评估 while 条件。它绝对不是简单地重复循环(-1)。 - xtofl
是的,你说得对。我在while{}中弄混了,在这种情况下它会回到循环的顶部并重新评估。 - Andres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接