продолжить работу через некоторое время? - PullRequest
21 голосов
/ 07 января 2010

У меня есть время, которое выглядит так:

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, и пользователь будет нулевым, так что все будет сломано?

Может быть, мне следует переделать цикл в оператор while?

Ответы [ 7 ]

34 голосов
/ 07 января 2010

Продолжение позволяет перейти к оценке на дне, чтобы программа могла оценить, нужно ли продолжить с другой итерацией или выйти. В этом случае он выйдет.

Это спецификация: http://java.sun.com/docs/books/jls/third_edition/html/statements.html#6045

Такие языковые вопросы вы можете найти в Спецификации языка Java: http://java.sun.com/docs/books/jls/

4 голосов
/ 07 января 2010

Это действительно не лучший способ написать этот код. Если пользователь имеет значение null, вы получите NullPointerException при попытке получить user.id в следующий раз. Лучший способ сделать это:

User user = UserDao.Get(1);
while(user != null) {
  // do something with the user
  user = UserDao.GetNext(user.id);
}
3 голосов
/ 07 января 2010

Почему вы тестируете пользователя в двух местах? Условие while прервет цикл, когда для пользователя задано нулевое значение. Это то, что вам нужно.

2 голосов
/ 07 января 2010

Да, continue будет работать в цикле do.. while.

Возможно, вы захотите использовать break вместо continue, чтобы прекратить обработку пользователей, или просто полностью удалить бит if null continue, так как цикл while разорвется, как только пользователь все равно будет нулевым.

0 голосов
/ 07 января 2010

Посмотрим:

$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 голосов
/ 07 января 2010

Короткий ответ да, продолжить (и прервать) работу должным образом в циклах do while.

Как уже указывали другие, из примера видно, что вы можете ожидать неправильного поведения при продолжении.

0 голосов
/ 07 января 2010

Оператор continue перейдет к оператору вычисления цикла внутри while, который выглядит избыточным, поскольку ваши if и while оценивают одно и то же. Я думаю, что было бы лучше использовать перерыв или просто позволить условию while выполнять свою работу (ваше условие while уже проверяет его для вас)

...