Java | do..while文

Java Java
スポンサーリンク

では、「実務(現場)で実際に使われる 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カウンタ制御が明確

タイトルとURLをコピーしました