0

0

Java基础项目如何实现ATM提款机模拟_账户对象封装与余额校验逻辑

P粉602998670

P粉602998670

发布时间:2026-03-12 15:02:31

|

211人浏览过

|

来源于php中文网

原创

Account类应将balance设为private BigDecimal,余额变更全由带校验的withdraw()等方法控制,禁止setBalance();输入解析、校验与执行须分离;提示语句不得写入Account,确保可测试性与扩展性。

java基础项目如何实现atm提款机模拟_账户对象封装与余额校验逻辑

Account 类怎么设计才不容易出余额负数问题

账户对象不是把 balance 做成 public double 就完事了——直接暴露字段会导致外部随意修改,校验逻辑分散,一改就漏。核心是把余额变更全收口到方法里,且每次变更都强制走校验。

  • balance 必须是 private,不提供 setBalance() 这类“后门”方法
  • 提款操作只允许通过 withdraw(double amount),且该方法内部必须先判断 amount > 0balance >= amount
  • 推荐用 BigDecimal 而非 double 存余额,避免浮点误差(比如 10.0 - 9.99 = 0.010000000000000009)
  • 构造函数里对初始余额也要校验:if (initialBalance.compareTo(BigDecimal.ZERO)

withdraw() 方法里校验失败该抛什么异常

别用 System.out.println() 打印错误,也别返回 false 让调用方自己猜失败原因。ATM 场景下,余额不足、金额非法、系统异常要区分清楚,否则上层没法做对应提示或重试。

  • 余额不足 → 抛 InsufficientFundsException(自定义运行时异常),让 UI 显示“余额不足,请重新输入”
  • 金额 ≤ 0 或非数字 → 抛 IllegalArgumentException,前端可捕获并高亮输入框
  • 数据库更新失败(如有持久化)→ 抛 RuntimeException 或更具体的 DataAccessException,触发事务回滚
  • 不要吞掉异常:写 catch (Exception e) { } 然后静默失败,这是最常踩的坑

主流程里怎么防止用户输错后直接跳到取款成功

很多初学者把输入解析、校验、业务执行混在一段 main() 里,一个 Scanner 读完就调 account.withdraw(),结果用户输个 "abc" 或 "-100",程序要么报 InputMismatchException 崩掉,要么因没校验直接扣款为负。

百宝箱
百宝箱

百宝箱是支付宝推出的一站式AI原生应用开发平台,无需任何代码基础,只需三步即可完成AI应用的创建与发布。

下载
  • 输入解析必须独立封装,例如 parseAmount(String input):用 try-catch 捕获 NumberFormatException,失败时返回 Optional.empty() 或抛受检异常
  • 校验和执行要分两步:先 if (account.canWithdraw(amount))(只读判断),再 account.withdraw(amount)(实际扣款)
  • 控制台交互建议加循环重试:while (!validInput) { ... },而不是“输错一次就退出”
  • 注意 Scanner 的换行残留:nextLine() 前如果用了 nextInt(),得额外加一行 scanner.nextLine() 清缓冲区,否则后续输入会跳过

为什么 ATM 模拟里不该在 Account 里写 print 语句

Account 是模型,只管数据和规则;输出提示是表现层职责。把 System.out.println("取款成功") 写进 withdraw(),会导致单元测试难写、无法对接 GUI、日志格式混乱。

立即学习Java免费学习笔记(深入)”;

  • withdraw() 只做三件事:校验参数、校验余额、更新 balance 字段——成功就返回 voidboolean,失败就抛异常
  • 所有提示文字(如“请输入取款金额”“取款成功,当前余额:xxx”)统一放在 ATMServiceMain 类里
  • 这样改需求时才灵活:比如以后要加微信通知,只需改服务层,Account 类完全不动
  • 顺便提醒:别在 toString() 里拼接提示语,它只该返回对象状态快照,比如 "Account{balance=123.45}"

事情说清了就结束。真正麻烦的不是写完能跑通,而是当你要加手续费、日限额、多币种、事务日志时,发现 Account 里到处散着 System.out 和裸 double 字段——那时候重构成本比重写还高。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1030

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

367

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.09.25

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号