想象一下在健身房锻炼的场景。利用do……while循环表示:
- 先做一次训练(循环体执行)
- 然后看看效果(条件判断)
- 决定是否继续(是否进入下一次循环)
这和while循环不同,while循环是先在门口看看人多人少才决定进不进去。而do...while是二话不说先练起来再说!
do……while语法结构
do {
// 循环体语句
} while (条件表达式);
do……while结构保证了循环体至少执行一次,然后根据条件决定是否继续;就像至少会尝试一次健身,然后根据感受决定要不要继续。
案例解析
用户密码验证
编写一个程序看,模拟用户登录时的密码验证。
# 源文件保存为“PasswordValidation.java”。
import java.util.Scanner;
public class PasswordValidation {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String correctPassword = "java123";
String userInput;
int attempts = 0;
do {
System.out.print("请输入密码:");
userInput = scanner.nextLine();
attempts++;
if(!userInput.equals(correctPassword)) {
System.out.println("密码错误!您已尝试" + attempts + "次");
}
} while (!userInput.equals(correctPassword) && attempts < 3);
if(userInput.equals(correctPassword)) {
System.out.println("登录成功!");
} else {
System.out.println("尝试次数过多,账户已锁定");
}
scanner.close();
}
}
运行结果 输入3次错误的密码
请输入密码:123456 密码错误!您已尝试1次 请输入密码:456123 密码错误!您已尝试2次 请输入密码:789456 密码错误!您已尝试3次 尝试次数过多,账户已锁定
输入正确密码
请输入密码:java123 登录成功!
代码解析:
- 程序首先会要求用户输入密码(至少执行一次)
- 检查密码是否正确,并记录尝试次数
- 当密码错误且尝试次数小于3次时,继续循环
- 退出循环后根据情况输出相应提示
这个例子很好地展示了do...while的特点:至少要给用户一次输入机会。
购物车结算系统
编写一个程序,模拟电商网站购物车结算系统。
# 源文件保存为“ShoppingCartCheckout.java”。
import java.util.Scanner;
public class ShoppingCartCheckout {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double total = 0.0;
String itemName;
double itemPrice;
char continueShopping;
System.out.println("=== 欢迎来到Java超市结算系统 ===");
do {
System.out.print("请输入商品名称:");
itemName = scanner.next();
System.out.print("请输入商品价格:");
itemPrice = scanner.nextDouble();
total += itemPrice;
System.out.printf("已添加 %s 到购物车,当前总计:%.2f元\n", itemName, total);
System.out.print("是否继续购物?(y/n):");
continueShopping = scanner.next().charAt(0);
} while (continueShopping == 'y' || continueShopping == 'Y');
System.out.printf("\n购物结算完成,总金额:%.2f元\n", total);
System.out.println("感谢您的光临!");
scanner.close();
}
}
代码运行效果: 依次输入产品和价格。
=== 欢迎来到Java超市结算系统 === 请输入商品名称:牛奶 请输入商品价格:12.5 已添加 牛奶 到购物车,当前总计:12.50元 是否继续购物?(y/n):y 请输入商品名称:面包 请输入商品价格:8.8 已添加 面包 到购物车,当前总计:21.30元 是否继续购物?(y/n):n
购物结算完成,总金额:21.30元 感谢您的光临!
常见错误及解决方法
忘记分号
do {
//...
} while(条件) // 这里缺少分号
解决方法:记住while后面的小括号外必须加分号。
条件永远为真导致无限循环
int i = 0;
do {
System.out.println(i);
// 忘记写i++导致i永远不增加
} while (i < 10);
解决方法:确保循环条件最终会变为false。
错误的条件判断
int i = 10;
do {
System.out.println(i);
i++;
} while (i < 5); // 初始就不满足但仍会执行一次
解决方法:理解do...while至少执行一次的特性,确保逻辑正确
练习题
理论练习题
-
do...while循环和while循环最主要的区别是什么? 答案:do...while循环至少执行一次循环体,而while循环可能一次都不执行。
-
下列代码会输出什么?
int x = 5; do { System.out.print(x + " "); x--; } while (x > 0);
答案:输出"5 4 3 2 1 ",因为从5递减到1,当x=0时退出循环。
-
什么情况下应该优先选择do...while而不是while循环? 答案:当需要至少执行一次循环体时,比如菜单显示、用户输入验证等场景。
-
如果超市结算系统改用while循环实现,会有什么潜在问题? 答案:使用while循环时,如果用户一开始就选择不购物,程序会变得很奇怪。而do...while确保至少执行一次结算流程,更符合实际场景
-
下面这段代码有什么问题?
int count = 5; do { System.out.println(count); count++; } while (count < 5);
答案:虽然循环条件初始就不满足,但do...while仍会执行一次,输出5。这可能不是程序员的本意,需要注意这种特性。
-
为什么购物车案例中使用charAt(0)来获取用户输入? 答案:Scanner的next()方法返回字符串,而我们需要单个字符做判断。charAt(0)取字符串第一个字符,既简化输入又避免字符串比较的开销。
实操练习题
编写一个程序,使用do...while循环计算1到100的偶数和
# 源文件保存为“EvenNumbers.java”。
public class EvenNumbers {
public static void main(String[] args) {
int sum = 0;
int num = 1;
do {
if(num % 2 == 0) {
sum += num;
}
num++;
} while (num <= 100);
System.out.println("1到100的偶数和为:" + sum);
}
}
运行结果
1到100的偶数和为:2550