1. 概述
本文将深入讲解 Java 语言中的一个基础但关键的控制结构——do-while
循环。它用于在满足条件的前提下,重复执行一段代码块。与 while
循环不同的是,do-while
能保证循环体至少执行一次,这在某些场景下非常实用,比如用户输入校验、资源重试机制等,避免了冗余的代码重复。
2. do-while 循环详解
do-while
循环的核心特点是:先执行,后判断。也就是说,无论循环条件是否成立,循环体都会先执行一次,然后再检查条件是否为 true
,若为 true
则继续下一轮循环,否则退出。
其语法结构如下:
do {
// 循环体:要重复执行的语句
statement;
} while (Boolean-expression);
⚠️ 注意:
while
后面的括号()
不能省略。- 即使循环体只有一条语句,也建议使用花括号
{}
包裹,提升可读性,避免后续维护时出错。 while
后必须以分号;
结尾,这是do-while
独有的语法要求,容易遗漏。
✅ 示例:基础用法
下面是一个简单的例子,打印变量 i
从 0 到 4 的值:
int i = 0;
do {
System.out.println("Do-While loop: i = " + i++);
} while (i < 5);
输出结果为:
Do-While loop: i = 0
Do-While loop: i = 1
Do-While loop: i = 2
Do-While loop: i = 3
Do-While loop: i = 4
虽然这个例子用 while
循环也能实现,但如果初始条件不满足(比如 i = 10
),while
循环会直接跳过,而 do-while
仍会执行一次——这正是它的价值所在。
🧠 典型使用场景
以下是 do-while
更常见的实战场景,能体现其“至少执行一次”的优势:
场景一:用户交互式输入
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
String input;
do {
System.out.print("请输入 'quit' 退出: ");
input = scanner.nextLine();
System.out.println("你输入的是: " + input);
} while (!input.equals("quit"));
✅ 优势:用户至少能看到一次提示信息,避免因初始条件判断失败导致“黑屏无响应”的尴尬。
场景二:带重试逻辑的操作
int attempts = 0;
final int MAX_ATTEMPTS = 3;
boolean success = false;
do {
attempts++;
System.out.println("第 " + attempts + " 次尝试连接数据库...");
// 模拟操作:可能成功也可能失败
success = simulateDatabaseConnect();
if (success) {
System.out.println("连接成功!");
} else if (attempts < MAX_ATTEMPTS) {
System.out.println("连接失败,正在重试...");
}
} while (!success && attempts < MAX_ATTEMPTS);
if (!success) {
System.err.println("已达到最大重试次数,程序退出。");
}
// 模拟连接方法
private static boolean simulateDatabaseConnect() {
return Math.random() > 0.7; // 30% 概率成功
}
✅ 优势:即使首次调用就失败,也能进入重试流程,逻辑清晰,代码简洁。
3. 注意事项与踩坑提醒
使用 do-while
时,有几个容易忽略的点:
❌ 无限循环风险:如果条件始终不满足,且循环体内没有
break
或状态变更,会导致死循环。do { System.out.println("Oops!"); } while (true); // 死循环
⚠️ 变量作用域:循环内定义的变量不能在
while
条件中使用,除非声明在外部。✅ 推荐使用场景:当你需要“先做一次,再判断是否继续”时,
do-while
是最直接、最语义清晰的选择。
4. 总结
do-while
循环是 Java 控制流中不可或缺的一环,其“先执行后判断”的特性在用户交互、资源重试、状态轮询等场景中表现出色。虽然使用频率不如 for
或 while
高,但在合适的场景下能写出更简洁、语义更明确的代码。
代码示例已上传至 GitHub 仓库,便于查阅和运行:
👉 https://github.com/baeldung/java-tutorials/tree/master/core-java-lang-syntax