while先判断后执行,do-while先执行后判断;前者条件为假时一次不执行,后者至少执行一次,适用于菜单、密码重试等必须首执场景,且do-while末尾分号不可省略。

while 和 do-while 的执行顺序到底差在哪
核心就一句:while 是先判断、再执行;do-while 是先干一次、再看还干不干。
这意味着:如果初始条件就是 false,while 里的代码块一次都不会跑;而 do-while 至少会执行一遍——哪怕你刚进来就知道该停了。
-
while (i > 10) { System.out.println(i); }→ 如果i初始是5,啥也不输出 -
do { System.out.println(i); } while (i > 10);→ 同样i = 5,也会先打一行5,然后才判断退出
什么时候必须用 do-while,换 while 就会出错
典型场景是「用户交互类逻辑」,比如菜单、密码重试、初始化后校验——这些动作天然要求「至少展示/执行一次」。
换成 while,你就得手动补一次逻辑,或者绕弯加标志位,反而增加出错概率。
立即学习“Java免费学习笔记(深入)”;
- 菜单循环:
do { showMenu(); choice = scan.nextInt(); } while (choice != 0); - 密码输入:
do { pwd = inputPassword(); } while (!isValid(pwd)); - 错误写法:
while (!isValid(pwd)) { pwd = inputPassword(); }→ 第一次pwd是未定义的,可能 NPE 或逻辑空转
语法上最容易漏掉的那个分号
do-while 结尾那个分号不是可有可无的装饰,而是语法必需。漏了直接编译失败;多了或放错位置,又容易引发意外行为。
- 正确:
do { ... } while (condition);(结尾有分号) - 错误:
do { ... } while (condition)(缺分号 → 编译报错) - 更危险的错误:
while (condition); { ... }(多写了分号 → 循环体被跳过,大括号变普通代码块)
别在循环里忘了更新变量,否则死循环没商量
两种循环都依赖条件变化来退出,但 do-while 因为强制首执,更容易掩盖「变量没更新」的问题——它会先跑一遍,再卡住不动,现象比 while 更隐蔽。
- 常见表现:控制台只输出一次,然后程序挂住,CPU 占用飙升
- 检查点:确认循环体内是否修改了用于判断的变量(如
i++、input = scanner.next()) - 调试技巧:在循环体开头加
System.out.println("looping with i=" + i);,一眼看出变量是否停滞
最常被忽略的是:你以为条件会自然变化,其实变量根本没动;或者更新语句写在 if 分支里,某些路径下直接跳过。这种问题在 do-while 里尤其难一眼发现。










