ここでは、実務でよく登場する do...while の3大パターンを、
・動作のイメージ
・実際のコード
・ポイント解説
をセットでわかりやすく紹介します。
① メニュー処理(ユーザー操作を繰り返す)
よくある場面
- コンソールアプリや管理ツールで「メニューを繰り返し表示」し、
ユーザーが「終了」を選ぶまで続ける。
コード例
import java.util.Scanner;
public class MenuExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int choice;
do {
System.out.println("========== メニュー ==========");
System.out.println("1. データ表示");
System.out.println("2. データ保存");
System.out.println("0. 終了");
System.out.println("============================");
System.out.print("番号を選んでください: ");
choice = sc.nextInt();
switch (choice) {
case 1:
System.out.println("データを表示しました。\n");
break;
case 2:
System.out.println("データを保存しました。\n");
break;
case 0:
System.out.println("終了します。");
break;
default:
System.out.println("無効な番号です。もう一度入力してください。\n");
}
} while (choice != 0);
sc.close();
}
}
Java解説
- メニューは 必ず1回表示 したいので、
doの中に入れる。 choice != 0の間はループを継続。0を選ぶとfalse→ 終了。switchで分岐処理を整理(可読性が高く実務でも好まれる)。
実務ポイント
- 本番アプリではこの構造をベースに、
「各メニュー項目を別クラスのメソッドとして呼び出す」
など、責務を分離して拡張します。 - UIアプリでも「ユーザー操作を待つループ」は似た発想(イベントループなど)。
② リトライ処理(通信・ファイルアクセスなど)
よくある場面
- 通信が失敗したときに「最大3回まで再試行する」。
- データベース接続やAPI呼び出しで、1回で失敗しても諦めない制御。
コード例
public class RetryExample {
public static void main(String[] args) {
int attempts = 0;
boolean success = false;
do {
attempts++;
System.out.println("[" + attempts + "回目] 接続中...");
// 疑似的な通信結果(30%の確率で成功)
success = Math.random() < 0.3;
if (success) {
System.out.println("接続成功 ✅\n");
} else {
System.out.println("接続失敗 ❌\n");
}
} while (!success && attempts < 3);
if (!success) {
System.out.println("3回試行しましたが、接続できませんでした。");
}
}
}
Java解説
- 条件:
!success && attempts < 3
→ 成功していない間 or 試行回数が上限未満なら再実行。 - 実務では、実際の通信処理を
try { ... } catch (Exception e) {}の中に書く。 - 成功した時点でループを抜ける。
実務ポイント
do...whileにすることで、
「まず1回は試す(最初の試行) → 条件次第で再試行」
の流れを自然に書ける。- よく見かける場面:
- API呼び出し再試行
- ファイルロック解除までの待機
- DBリトライロジック
応用例(本番コード風)
do {
try {
processDataFromServer();
success = true;
} catch (IOException e) {
System.err.println("通信失敗。再試行します...");
Thread.sleep(1000); // 1秒待って再試行
}
attempts++;
} while (!success && attempts < MAX_RETRY);
Java③ ユーザー入力ループ(バリデーション)
よくある場面
- 入力値が正しいかチェックして、
不正なら再入力を促す。 - ユーザー体験を損ねないよう、最初の入力を必ず受け取ることが大事。
コード例
import java.util.Scanner;
public class InputValidationExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int age;
do {
System.out.print("年齢を入力してください(1〜120):");
age = sc.nextInt();
if (age < 1 || age > 120) {
System.out.println("無効な値です。もう一度入力してください。\n");
}
} while (age < 1 || age > 120);
System.out.println("入力された年齢:" + age + "歳");
sc.close();
}
}
Java解説
doブロックで必ず1回入力を受ける。- 範囲外ならメッセージを表示して再度入力。
- 条件が満たされる(正しい入力)まで繰り返す。
実務ポイント
- 入力バリデーションは フォーム入力・設定値のチェック・CLIツール でよく出る。
- GUIアプリやWebアプリでも「最低1回の入力」+「不正なら再表示」は同じ構造。
- 実務では、入力値を検証するメソッドを切り出してテストしやすくします。
まとめ(使い分け早見表)
| 用途 | 条件式でのタイミング | 例 | 特徴 |
|---|---|---|---|
🔁 for | 回数が明確なループ | 1〜10のカウント | 繰り返し回数が決まっている |
🔁 while | 条件が満たされる間だけ | ファイルが存在する間処理 | 実行前にチェック |
🔁 do...while | 最低1回実行してから判定 | 入力・メニュー・リトライ | 一度は実行したい処理 |
さらに実務的に強くなるヒント
- 「リトライ間隔」や「最大回数」 は設定ファイル(
config.propertiesなど)から読み込むと柔軟。 - 例外処理(
try-catch-finally)と組み合わせて「安全なループ脱出」を設計する。 - 単体テスト時には
do...whileループの条件をモックして、ループの回数を制御可能にする。
