web-dev-qa-db-ja.com

しばらくの間作業を続けますか?

私はそれが次のように見える間やることがあります:

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ステートメントに作り直す必要がありますか?

22
mrblah

続行すると、ボタンの評価にジャンプするため、プログラムは、別の反復または終了を続行する必要があるかどうかを評価できます。この場合、終了します。

これは仕様です: http://Java.Sun.com/docs/books/jls/third_edition/html/statements.html#6045

このような言語の質問は、Java言語仕様: http://Java.Sun.com/docs/books/jls/ で検索できます。

36
helios

これは、このコードを書くための最良の方法ではありません。 userがnullの場合、次回user.idを取得しようとすると、NullPointerExceptionが発生します。これを行うためのより良い方法は次のとおりです。

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

なぜ2か所でユーザーをテストしているのですか? while条件は、ユーザーがnullの場合にループを終了します。これは、必要なことです。

3
alphazero

はい、continueはdo..whileループで機能します。

breakの代わりにcontinueを使用してユーザーの処理を停止するか、ユーザーがnullになるとすぐにwhileループが発生するため、if null continueビットを完全に削除することをお勧めします。 。

2
Rich Adams

続行は、while内のループ評価ステートメントにジャンプします。これは、ifとwhileが同じものを評価しているように冗長に見えます。休憩を使用するか、単にwhile条件で作業を行う方がよいと思います(while条件で既にチェックされています)

0
Andres

短い答えはい、続行(および中断)はdowhileループで適切に機能します。

しかし、他の人が指摘しているように、この例からは、続行すると間違った動作が予想されるように見えます。

0
patros

どれどれ:

$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ステートメントが実行され、後で変数が増加するのを防いだため、continue値が100であることがわかります。

0
OscarRyz