在Java中实现控制台记账程序_Java输入输出综合练习说明

发布时间 - 2026-01-02 00:00:00    点击率:
应使用Record类封装账目字段并存入ArrayList,用hasNextDouble()预检金额、nextLine()配合trim()和正则校验日期,PrintWriter追加写入,BufferedReader加载时先判空再分段校验。

如何用 Scanner 安全读取用户输入的金额和日期

控制台记账程序最常崩在输入环节:用户输个字母,nextDouble() 直接抛 InputMismatchException;输完金额按回车,nextLine() 却读到空字符串——这是 nextXxx() 留下的换行符没清掉。

  • 金额统一用 nextDouble() + hasNextDouble() 预检,避免异常中断流程
  • 日期字符串(如 "2025-05-20")必须用 nextLine(),且调用前加一次 scanner.nextLine() 消费残留换行符
  • 别信用户会乖乖按格式输,用 String.trim() 清空首尾空格,再用正则 \\d{4}-\\d{2}-\\d{2} 校验格式

ArrayList 存数据时为什么不能直接存 doubleString

记一笔账至少要带时间、类型(收入/支出)、金额、备注。如果把四个字段拆成四个平行 ArrayList,删第 3 条记录时得同步删四个列表的索引 2,极易错位;更麻烦的是排序或按日期过滤时,你得自己维护所有列表的下标映射。

  • 定义一个 Record 类,封装 datetypeamountnote 四个字段
  • 用单个 ArrayList 存所有账目,增删改查都只操作一个容器
  • 重写 toString() 方便打印,比如返回 "2025-05-20 支出 ¥128.50 外卖"

保存到文件时为什么推荐用 PrintWriter 而不是 FileWriter

FileWriter 写字符串没问题,但记账程序要写多行结构化数据(每笔一条),还得支持追加、自动换行、编码控制——这些 FileWriter 都得手动处理,而 PrintWriter 开箱即用。

  • 构造时传 new FileWriter("records.txt", true) 实现追加模式
  • 直接调 printWriter.println(record.toString()),自动换行且不抛 IOException(错误靠 checkError() 查)
  • 务必在程序退出前调 printWriter.close(),否则缓冲区内容可能丢失

从文件加载历史记录时怎么跳过空行和非法格式行

用户可能手动编辑过 records.txt,导致某行缺字段、日期格式错、金额非数字。用 BufferedReader 逐行读取后,必须校验再解析,不能无脑 split(" ")

String line = bufferedReader.readLine();
if (line == null || line.trim().isEmpty()) continue;
String[] parts = line.split(" ", 4); // 最多切4段,防止备注里有空格被误切
if (parts.length != 4) continue;
// 再分别校验 parts[0] 是否为日期、parts[2] 是否能 parseDouble...

关键点在于:先判空再切分,切分用限定次数,校验放在解析前——否则 NumberFormatException 又会打断加载流程。

日期字符串转 LocalDate 时别用已废弃的 SimpleDateFormat,直接用 LocalDate.parse(parts[0]),它默认支持 "yyyy-MM-dd" 格式。


# java  # 编码  # 外卖  # yy  # 为什么  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript中对象的定义、使用以及对象和原型链操作小结  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel怎么在Blade中安全地输出原始HTML内容  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  详解Oracle修改字段类型方法总结  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  如何在万网主机上快速搭建网站?  怎样使用JSON进行数据交换_它有什么限制  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  微信小程序 input输入框控件详解及实例(多种示例)  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  javascript中的try catch异常捕获机制用法分析  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Java类加载基本过程详细介绍  使用Dockerfile构建java web环境  如何在 Pandas 中基于一列条件计算另一列的分组均值  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel如何处理表单验证?(Requests代码示例)  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  网站优化排名时,需要考虑哪些问题呢?  如何用VPS主机快速搭建个人网站?  EditPlus中的正则表达式实战(6)  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何在阿里云购买域名并搭建网站?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  千库网官网入口推荐 千库网设计创意平台入口  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何快速重置建站主机并恢复默认配置?  韩国服务器如何优化跨境访问实现高效连接?  装修招标网站设计制作流程,装修招标流程?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  EditPlus中的正则表达式 实战(4)  Laravel如何记录自定义日志?(Log频道配置)  如何用5美元大硬盘VPS安全高效搭建个人网站?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Python高阶函数应用_函数作为参数说明【指导】  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Android 常见的图片加载框架详细介绍  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何在阿里云服务器自主搭建网站?  微信小程序 HTTPS报错整理常见问题及解决方案