Java初学者开发日程管理工具应先用ArrayList和控制台实现核心逻辑:用DateTimeFormatter解析时间、Schedule类用final字段+全参构造器保证不可变性、遍历删除时倒序索引或批量操作、输入前清空缓冲区避免空行。

Java初学者做日程管理工具,别一上来就搞数据库和图形界面——先用 ArrayList 和控制台把核心逻辑跑通,否则连「添加日程」都可能 NullPointerException 或时间解析失败。
怎么用 LocalDateTime 正确解析用户输入的时间
新手常直接用 new Date() 或字符串拼接,结果时区错乱、格式崩溃。Java 8+ 必须用 DateTimeFormatter 显式定义格式,且要捕获 DateTimeParseException。
- 用户输入建议统一为
yyyy-MM-dd HH:mm(如2024-05-20 14:30),避免歧义 - 解析时必须用
LocalDateTime.parse(input, formatter),不能用parse(input)默认格式 - 别在
Scanner.nextLine()后漏掉scanner.skip("\\R"),否则下一次读取会跳过输入
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
String input = scanner.nextLine().trim();
try {
LocalDateTime time = LocalDateTime.parse(input, formatter);
} catch (DateTimeParseException e) {
System.out.println("时间格式错误,请输入:yyyy-MM-dd HH:mm");
}
为什么日程类要用 final 字段 + 全参构造器,而不是 setter
日程一旦创建,时间、标题就不该被随意修改——否则排序混乱、重复判断失效。用 final 强制不可变,再配合 compareTo 实现自然排序,TreeSet 或 Collections.sort() 才可靠。
-
title、startTime、endTime全部声明为final - 构造器里校验
startTime.isBefore(endTime),不满足直接抛IllegalArgumentException - 重写
compareTo按startTime升序,避免后续手动排序出错
public class Schedule implements Comparable{ private final String title; private final LocalDateTime startTime; private final LocalDateTime endTime; public Schedule(String title, LocalDateTime start, LocalDateTime end) { if (!start.isBefore(end)) throw new IllegalArgumentException("开始时间必须早于结束时间"); this.title = title; this.startTime = start; this.endTime = end; } @Override public int compareTo(Schedule other) { return this.startTime.compareTo(other.startTime); } }
控制台交互中如何避免 ConcurrentModificationException 和空指针
遍历 ArrayList 时一边打印一边删元素?或者没判空就调 schedules.get(0).getTitle()?这两种操作在初学者代码里高频报错。
立即学习“Java免费学习笔记(深入)”;
- 删除多个日程时,用索引倒序遍历:
for (int i = list.size()-1; i >= 0; i--),或收集待删 ID 后批量removeAll() - 所有从列表取值前加
if (!list.isEmpty()),尤其显示「最近一条日程」这种功能 - 用户输入数字编号选日程时,必须校验
index >= 0 && index ,别信用户不手滑
最易被忽略的其实是输入缓冲区残留——比如用 nextInt() 读菜单选项后,紧接着 nextLine() 会立刻返回空行。这个坑不处理,整个交互流程就卡在标题输入环节,但错误信息里根本看不出原因。










