在Java里如何实现小型记账管理系统_Java面向对象实践说明
发布时间 - 2026-01-21 00:00:00 点击率:次用Java建模记账系统需先定义Account、Transaction、Category(枚举)三类,封装TransactionManager管理业务逻辑与余额同步,输入校验防异常,CSV持久化确保数据可靠。
如何用 Java 类建模记账核心实体
记账系统最关键的不是界面或存储,而是把「账目」「账户」「分类」这些现实概念准确映射为类。别一上来就写 main,先想清楚职责边界。
-
Account类只管账户名、余额、创建时间,不处理记账逻辑 -
Transaction类必须包含金额(double amount)、类型(String type,如 "income" / "expense")、分类(Category category)、时间(LocalDateTime time)和可选备注 -
Category用枚举比字符串更安全:public enum Category { FOOD, TRANSPORT, SALARY, ENTERTAINMENT } - 避免在
Transaction里直接存账户名字符串——用Account引用,方便后期扩展(比如查某账户所有流水)
为什么不用 ArrayList 而要封装成 TransactionManag

直接在 Main 里用 ArrayList 看似简单,但很快会遇到:重复添加、按月筛选失效、余额算错、无法撤销操作。把这些逻辑全塞进一个列表变量,等于把业务规则藏在调用处,没人能一眼看出约束。
- 新建
TransactionManager类,内部持有一个private Listtransactions - 提供
add(Transaction t)方法,在里面校验:t.getAmount() != 0、t.getTime() != null、关联的Account是否已存在 - 余额不能靠遍历重算——每个
Account应维护自己的balance,并在TransactionManager.add()中同步更新(否则多线程或频繁查询时性能崩盘) - 不要暴露
getTransactions()返回原始List,改用unmodifiableList或返回副本,防止外部误修改
控制台交互中容易被忽略的输入校验点
用户输错一个字符,程序就抛 InputMismatchException 或 DateTimeParseException,体验极差。Java 的 Scanner 默认不校验格式,得自己兜底。
- 读取金额时,用
scanner.hasNextDouble()判断再nextDouble(),而不是直接nextDouble()后 catch - 解析日期用
DateTimeFormatter.ofPattern("yyyy-MM-dd"),并 try-catchDateTimeParseException,提示“请输入 2025-03-15 格式” - 选择菜单项时,用
scanner.hasNextInt()+ 范围检查(比如选项是 1–5,就判断input >= 1 && input ),别依赖nextInt()的异常机制做流程控制 - 字符串输入后立刻调用
trim(),空格导致的"food "和"food"不匹配是高频 Bug
文件持久化选哪种方式更轻量可靠
小型记账不需要数据库。用 ObjectOutputStream 直接序列化整个 TransactionManager?危险——Java 序列化版本不兼容、文件不可读、升级类字段后旧数据直接报废。
- 选 CSV 更务实:每行一条交易,字段用逗号分隔,用
Files.write()写入,用Files.readAllLines()读取 - CSV 字段顺序固定:id,accountName,amount,type,category,date,note;日期统一用
toString()(即 "2025-03-15T09:30"),读取时再 parse - 注意转义:用户备注含逗号或换行符?用双引号包裹字段,并将字段内双引号替换成两个双引号(标准 CSV 规则)
- 每次保存都覆盖全量文件,别尝试追加——否则删除某条记录后,文件里还留着脏数据
真正难的不是写完功能,是让每一笔账在重启后仍能对得上余额、分类不乱、日期不变成 1970 年——这些细节都在 TransactionManager 的增删改查契约里,不在 main 函数的 print 语句中。
# java
# go
# csv
# ai
# stream
# yy
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现API速率限制?(Rate Limiting教程)
北京专业网站制作设计师招聘,北京白云观官方网站?
如何在万网利用已有域名快速建站?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Laravel如何配置Horizon来管理队列?(安装和使用)
使用C语言编写圣诞表白程序
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
中山网站制作网页,中山新生登记系统登记流程?
香港服务器选型指南:免备案配置与高效建站方案解析
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Android 常见的图片加载框架详细介绍
Laravel如何处理异常和错误?(Handler示例)
如何快速打造个性化非模板自助建站?
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
海南网站制作公司有哪些,海口网是哪家的?
如何登录建站主机?访问步骤全解析
iOS中将个别页面强制横屏其他页面竖屏
独立制作一个网站多少钱,建立网站需要花多少钱?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
微信公众帐号开发教程之图文消息全攻略
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel如何为API生成Swagger或OpenAPI文档
C++用Dijkstra(迪杰斯特拉)算法求最短路径
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
电商网站制作价格怎么算,网上拍卖流程以及规则?
bing浏览器学术搜索入口_bing学术文献检索地址
实现点击下箭头变上箭头来回切换的两种方法【推荐】
大型企业网站制作流程,做网站需要注册公司吗?
大连网站制作公司哪家好一点,大连买房网站哪个好?
浅述节点的创建及常见功能的实现
如何在服务器上配置二级域名建站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
常州企业网站制作公司,全国继续教育网怎么登录?
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Android okhttputils现在进度显示实例代码
JavaScript实现Fly Bird小游戏
如何实现建站之星域名转发设置?
如何在阿里云高效完成企业建站全流程?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
如何用IIS7快速搭建并优化网站站点?
创业网站制作流程,创业网站可靠吗?
Laravel如何与Inertia.js和Vue/React构建现代单页应用
如何为不同团队 ID 动态生成多个非值班状态按钮
Python结构化数据采集_字段抽取解析【教程】
Python函数文档自动校验_规范解析【教程】

