应使用卫语句提前返回:先检查amount≤0提示“取款金额必须大于0”,再检查amount>balance提示“余额不足”,最后检查amount>MAX_WITHDRAW提示“单笔最高取款5000元”。

用 if-else 实现取款金额校验
用户输入取款金额后,必须立刻判断是否合法:不能为负数、不能超过账户余额、不能超过单笔限额(比如5000元)。if 嵌套容易出错,建议用「卫语句」提前拦截:
- 先检查
amount ,直接提示“请输入有效金额” - 再检查
amount > balance,提示“余额不足” - 最后检查
amount > MAX_WITHDRAW(如5000),提示“单笔最高取款5000元”
避免写成 if (amount > 0 && amount 这种长条件——可读性差,出错时难定位是哪个条件不满足。
switch 处理主菜单选项
ATM主界面通常有“查询余额”“取款”“存款”“退出”四个选项,用 switch 比一串 if-else if 更清晰。注意两点:
- 用户输入应先用
Integer.parseInt()转成int,但必须包在try-catch里防输入字母导致NumberFormatException -
default分支不能空着,要明确提示“无效选项,请重新选择”并继续循环,否则输错就直接退出了
示例片段:
switch (choice) {
case 1: showBalance(); break;
case 2: withdraw(); break;
case 3: deposit(); break;
case 4: System.out.println("感谢使用"); return;
default: System.out.println("无效选项"); continue;
}
while 循环控制ATM会话生命周期
整个ATM流程必须持续运行,直到用户主动选“退出”,所以外层用 while (true) 最直接。但要注意:
立即学习“Java免费学习笔记(深入)”;
- 不能把所有逻辑(包括 Scanner 初始化)都塞进循环里,否则每次循环都新建
Scanner可能导致资源泄漏或输入异常 - 退出条件必须放在循环体内显式
break或return,别依赖外部变量变化——Java没全局状态,靠布尔标记容易漏设 - 每次操作完应加一行空输出(
System.out.println()),否则菜单刷屏太快,用户看不清上一步结果
余额变更必须同步更新变量值
取款成功后,很多人只打印“取款成功”,却忘了执行 balance = balance - amount。这是最常见逻辑遗漏点:
- Java里数值类型是值传递,
withdraw(double amount)方法内部改参数不影响外部balance变量 - 要么把
balance设为类成员变量并在方法内直接修改,要么让方法返回新余额并重新赋值:balance = withdraw(balance, amount) - 如果后续还要加日志或数据库写入,这里就是唯一该更新余额的地方,多处分散赋值极易导致数据不一致
真正麻烦的不是写条件,而是保证每次业务动作后状态准确——ATM系统里,余额错一次,后面全不可信。









