では、「実務(現場)で実際に使われる do...while の例」を、目的別に3パターン紹介します。
単なる練習用ではなく、現場で「こういう意図で do...while を使う」という形で説明します。
例①:ユーザー入力の再試行(基本中の基本)
用途:コンソールアプリやCLIツールで、「最低1回は入力させたい」ケース。
import java.util.Scanner;
public class InputRetryExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String password;
do {
System.out.print("パスワードを入力してください(8文字以上): ");
password = sc.nextLine();
if (password.length() < 8) {
System.out.println("パスワードが短すぎます。もう一度。");
}
} while (password.length() < 8);
System.out.println("登録完了!");
sc.close();
}
}
Java🧠 ポイント解説
do内で1回必ず入力を受け取る。while条件で「再試行が必要か」を判定。- 入力チェックロジックを関数化すれば、複数入力でも流用可能。
💡実務での応用:
入力フォーム(CLI・システム設定ツール)で、
ユーザーが「空文字」や「不正値」を入れてもエラーを出して再入力を促す処理。
例②:API通信のリトライ(外部システム連携でよく使う)
用途:ネットワークが不安定なときに、数回だけ再試行する。
import java.io.IOException;
import java.util.Random;
public class ApiRetryExample {
public static void main(String[] args) {
int retryCount = 0;
boolean success;
do {
success = callApi(); // 疑似API呼び出し
retryCount++;
if (!success) {
System.out.println("再試行中... (" + retryCount + "回目)");
try {
Thread.sleep(1000); // 1秒待機(サーバーに優しい)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} while (!success && retryCount < 3);
if (success) {
System.out.println("API呼び出し成功!");
} else {
System.out.println("API呼び出し失敗。上限に達しました。");
}
}
private static boolean callApi() {
// 疑似的に成功/失敗をランダムに発生
return new Random().nextBoolean();
}
}
Java🧠 ポイント解説
do...whileにより、最低1回はAPIを呼び出す。- 成功するまで最大3回試す。
- 実務ではこのような「再試行処理(retry logic)」が頻出。
- 実際には
Exponential backoff(指数的リトライ間隔)を入れることが多い。
例③:データベース接続 or ファイル処理の再試行
用途:リソースが一時的にロックされているとき、リトライして安定化。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbConnectionRetryExample {
public static void main(String[] args) {
int attempts = 0;
final int MAX_ATTEMPTS = 3;
boolean connected;
do {
connected = tryConnect();
attempts++;
if (!connected) {
System.out.println("接続失敗(" + attempts + "回目)。再試行します。");
try {
Thread.sleep(2000); // 2秒待機
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} while (!connected && attempts < MAX_ATTEMPTS);
if (connected) {
System.out.println("データベース接続成功!");
} else {
System.out.println("接続試行上限に達しました。終了します。");
}
}
private static boolean tryConnect() {
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testdb", "user", "pass")) {
return true;
} catch (SQLException e) {
return false;
}
}
}
Java🧠 ポイント解説
- 実務の「接続リトライ」で典型的に使われる。
whileではなくdo...whileを使うのは、「最初の接続試行」は必ず実行したいから。- 接続成功/失敗を
booleanで管理し、再試行の上限をMAX_ATTEMPTSで制御。
実務での「do…while」採用基準
| 条件 | do…while が向いている |
|---|---|
| 処理を最低1回は必ず行いたい | ✅ |
| 処理結果に応じて繰り返すか決めたい | ✅ |
| 前処理(入力、通信、計算)を実行してから判定する | ✅ |
| 繰り返す前に判定する(事前条件) | ❌ while文のほうが適切 |
まとめ
| シーン | 選ぶループ構文 | 理由 |
|---|---|---|
| 「少なくとも1回」実行が必要 | do...while | 最初に処理を行い、後で判定 |
| 条件が最初に分かっている | while | 実行前に判定可能 |
| 回数が決まっている | for | カウンタ制御が明確 |
