Java控制台待办事项系统是检验Scanner、ArrayList、类设计等综合能力的分水岭;需用Task类封装结构,ArrayList管理任务,统一用nextLine()防输入崩,while(true)菜单循环配switch,操作前校验索引并提示总数。

Java 控制台待办事项系统不是“练手玩具”,而是检验你能否把 Scanner、ArrayList、类设计、循环与分支真正串起来的分水岭。写不出来,往往不是语法不会,而是没想清「状态怎么存」「操作怎么闭环」「输入异常怎么不崩」。
用 ArrayList 存任务,别用数组或字符串拼接
很多人起步用 String[] 或一堆 String 变量存任务,结果增删时索引错乱、长度越界、空指针频发。待办事项天然有结构:标题、完成状态、创建时间(哪怕简化为布尔值)。必须封装成类:
class Task {
String title;
boolean done;
Task(String title) {
this.title = title;
this.done = false;
}
}主逻辑里用 ArrayList 管理:
- 增:直接
tasks.add(new Task(input)) - 删:用
tasks.remove(index),注意校验index >= 0 && index - 查/改:遍历
for (int i = 0; i ,用i+1当用户看到的序号(从 1 开始)
输入处理必须用 Scanner.nextLine() 配合 hasNextLine() 防崩
控制台交互最常崩在输入上。比如用户输数字选菜单,你用 scanner.nextInt() 后立刻跟 scanner.nextLine() —— 这会读到换行符,导致下一次 nextLine() 拿到空字符串。正确做法是:
立即学习“Java免费学习笔记(深入)”;
- 所有输入统一走
scanner.nextLine() - 数字选项先用
String input = scanner.nextLine().trim(),再用Integer.parseInt(input)并包try-catch - 空输入要拒绝:
if (input.isEmpty()) { System.out.println("输入不能为空"); continue; } - 别信
scanner.hasNext(),它可能卡住;用scanner.hasNextLine()更稳妥
菜单循环用 while (true) + break,别硬套 do-while
初学者容易把整个程序塞进 do-while,结果退出逻辑绕晕。真实需求是:显示菜单 → 等待输入 → 执行动作 → 回到菜单,除非用户明确选“退出”。更清晰的结构是:
while (true) {
showMenu();
String choice = scanner.nextLine().trim();
switch (choice) {
case "1": addTask(); break;
case "2": listTasks(); break;
case "3": markDone(); break;
case "0": System.out.println("再见"); return;
default: System.out.println("无效选项"); break;
}
}关键点:
-
return直接退出main,比break出循环再加标志位更直白 - 每个
case末尾必须break,漏了会穿透执行 - 把功能抽成独立方法(如
addTask()),避免switch块内堆砌 20 行代码
标记完成和删除必须校验索引,且提示要带当前列表长度
用户看到的序号是 1-based,但 ArrayList 是 0-based。最容易出错的是:用户输 “5” 要标记第 5 条,但当前只有 3 条任务。这时候不能静默失败,也不能抛异常让用户看堆栈。
- 每次操作前先打印列表,并注明总数:
System.out.println("共 " + tasks.size() + " 项:"); - 接收序号后立刻检查:
if (index tasks.size()) { System.out.println("请输入 1~" + tasks.size() + " 之间的数字"); continue; } - 转成数组索引用
index - 1,别写成index + 1或漏减 - 删除后记得提示「已删除:“xxx”」,否则用户不确定是否成功
真正的难点不在语法,而在于每一处用户输入都要预设他可能乱输、误按、中途 Ctrl+C —— 你写的不是程序,是和人打交道的界面。控制台没有撤销按钮,所以每一步确认、每一次提示、每一个边界检查,都是在替用户兜底。









