Продолжает ли работать в то время?
У меня есть вопрос, который выглядит так:
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, а пользователь имеет значение null, поэтому все будет нарушено?
Может быть, я должен переработать цикл для выражения while?
Ответы
Ответ 1
Продолжение приводит к тому, что он переходит к оценке на botton, поэтому программа может оценить, следует ли продолжить с другой итерацией или выходом. В этом случае он выйдет.
Это спецификация: http://java.sun.com/docs/books/jls/third_edition/html/statements.html#6045
Такие языковые вопросы вы можете найти в Спецификации языка Java: http://java.sun.com/docs/books/jls/
Ответ 2
Это действительно не лучший способ написать этот код. Если пользователь имеет значение NULL, вы получите исключение NullPointerException при попытке получить user.id в следующий раз. Лучший способ сделать это:
User user = UserDao.Get(1);
while(user != null) {
// do something with the user
user = UserDao.GetNext(user.id);
}
Ответ 3
Почему вы тестируете пользователя в двух местах? Условие while прекратит цикл, когда пользователь имеет значение null, что вам нужно.
Ответ 4
Да, continue
будет работать в цикле do..while.
Вероятно, вы хотите использовать break
вместо continue
, чтобы прекратить обработку пользователей, или просто полностью удалите бит if null continue
, так как цикл while будет вырываться, как только пользователь будет равно null.
Ответ 5
Продолжение перейдет к выражению оценки цикла внутри while, которое выглядит излишним, так как ваши if и while оценивают одно и то же. Я думаю, что было бы лучше использовать разрыв или просто позволить условию while выполнять работу (ваше условие уже проверяет его для вас)
Ответ 6
Короткий ответ yes, continue (и break) корректно работают во время циклов while.
Как отмечали другие, из примера видно, что вы можете ожидать продолжения неправильного поведения.
Ответ 7
Посмотрим:
$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
был выполнен и не позволил впоследствии увеличить переменную.