一、题目需求

(一)、整体解题思路框架
这段电影管理系统代码的核心思路是面向对象 + 数据容器 + 交互逻辑三层架构,本质是模拟一个轻量级的本地电影信息管理工具,核心目标是实现 “上架、查询、删除” 的基础 CRUD(创建、读取、更新、删除)功能。
(二)、分模块解题思路详解
1. 第一步:数据建模(Movie 实体类)
- 核心思路:用面向对象思想封装电影的核心属性,让 “电影” 成为可操作的独立对象。
- 具体实现:
- 提取电影的核心特征:ID(唯一标识)、名称、优惠价、其他信息,作为类的私有属性;
- 提供构造方法(用于创建电影对象)和 Getter/Setter(用于访问 / 修改属性);
- 重写toString()方法(方便直接打印电影信息,无需手动拼接字符串)。
- 设计目的:将电影的 “数据” 和 “行为” 封装,符合面向对象的封装原则,后续操作直接对Movie对象进行,而非零散的变量。
2. 第二步:数据存储(ArrayList 容器)
- 核心思路:选择ArrayList作为存储电影对象的容器,满足 “动态增删、遍历查询” 的需求。
- 关键设计:
- 声明private ArrayList<Movie> movieList,限定为私有属性,避免外部直接修改数据;
- 新增nextId自增变量:解决 “删除电影后 ID 重复” 的问题(若直接用movieList.size()+1生成 ID,删除后再上架会出现 ID 重复),保证每个电影 ID 唯一。
- 选择原因:ArrayList支持动态添加 / 删除元素,遍历效率高,完全匹配 “本地临时存储” 的需求(无需持久化到文件 / 数据库)。
3. 第三步:交互逻辑(菜单 + 用户输入)
- 核心思路:通过 “循环菜单 + Scanner 输入” 实现用户与程序的交互,让用户自主选择功能。
- 具体实现:
- showMenu()方法:用while(true)实现循环菜单,用户不选 “退出” 则一直停留在操作界面;
- 输入处理:
- 用sc.nextInt()接收用户的功能选择,sc.nextLine()处理换行符(避免nextDouble()/nextInt()后读取空字符串);
- 对非数字输入增加try-catch异常处理(比如用户输入字母代替数字),防止程序崩溃。
- 设计目的:模拟真实系统的交互体验,降低用户操作门槛,同时保证程序稳定性。
4. 第四步:核心功能实现(上架 / 查询 / 删除)
(1)上架电影(addMovie ())
- 思路:接收用户输入→验证输入合法性→创建电影对象→存入容器→反馈结果。
- 关键步骤:
- 接收用户输入的名称、价格、其他信息;
- 对价格做数字校验(避免输入非数字);
- 用nextId++生成唯一 ID,创建Movie对象;
- 将对象添加到movieList,并提示上架成功。
(2)查询功能(showAllMovies () + findMovieById ())
- 思路:分 “全量查询” 和 “精准查询”,先判断数据是否为空,再遍历容器处理。
- 全量查询:直接遍历movieList,打印所有电影对象(依赖重写的toString());
- 精准查询:接收用户输入的 ID→遍历容器匹配 ID→找到则输出信息,未找到则提示。
- 设计细节:先判断movieList.isEmpty(),避免遍历空集合,同时给用户友好提示(如 “暂无电影,请先上架”)。
(3)删除电影(deleteMovieById ())
- 思路:按 ID 精准删除,遍历容器匹配 ID→找到则移除元素→反馈结果。
- 关键步骤:
- 先判断集合是否为空,避免无效操作;
- 用for(int i=0; i<movieList.size(); i++)遍历(而非增强 for),因为增强 for 遍历中不能修改集合(会抛异常);
- 匹配 ID 后用movieList.remove(i)删除元素,并用return终止遍历(避免继续循环)。
5. 第五步:异常处理与用户体验优化
- 核心思路:预判用户可能的错误操作,提前处理,避免程序崩溃,同时提升交互友好性。
- 具体优化点:
- 输入非数字(如价格、ID)时,用try-catch捕获异常,提示用户重新输入;
- 所有功能先判断集合是否为空,避免空指针或无效遍历;
- 操作后给出明确反馈(如 “删除成功”“未找到该 ID 电影”),而非无提示。
二、完整代码示例
代码一:电影类
package com.sy.movie;
/**
* 电影类
*/
public class Movie {
// 电影ID
private int id;
// 电影名称
private String name;
// 电影优惠价格
private double price;
// 电影其他信息
private String info;
// 无参构造
public Movie() {
}
//有参构造
public Movie(int id, String name, double price, String info) {
this.id = id;
this.name = name;
this.price = price;
this.info = info;
}
//Getter和Setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
//重写toString方法,方便打印菜品信息
@Override
public String toString() {
return "【ID:" + id + "】" + name + "\\n" +
"信息:" + info + "\\n" +
"价格:¥" + price + "\\n" +
"————————";
}
}
代码二:电影管理类
package com.sy.movie;
import java.util.ArrayList;
import java.util.Scanner;
/**
* 电影管理类
*/
public class MovieManage {
// 存储所有的电影集合
private ArrayList<Movie> movieList = new ArrayList<>();
// 扫描器,用于接收用户输入
private Scanner sc = new Scanner(System.in);
// 自增ID(解决删除后ID重复问题)
private int nextId = 1;
// 展示操作界面
public void showMenu() {
while (true) {
System.out.println("\\n===== 电影管理系统 =====");
System.out.println("1. 上架电影");
System.out.println("2. 浏览所有电影");
System.out.println("3. 根据id查询电影");
System.out.println("4. 根据id删除电影");
System.out.println("5. 退出系统");
System.out.print("请输入您的选择:");
// 处理非数字输入的异常
int choice;
try {
choice = sc.nextInt();
sc.nextLine(); // 吞掉换行符
} catch (Exception e) {
System.out.println("请输入数字(1-5)!");
sc.nextLine(); // 清空错误输入
continue;
}
switch (choice) {
case 1:
addMovie();
break;
case 2:
showAllMovies();
break;
case 3:
findMovieById();
break;
case 4:
deleteMovieById();
break;
case 5:
System.out.println("退出系统,感谢使用!");
return;
default:
System.out.println("输入有误,请输入1-5的数字!");
}
}
}
// 1. 上架电影(修复换行符问题 + 自增ID)
private void addMovie() {
System.out.println("\\n— 上架电影 —");
System.out.print("请输入电影名称:");
String name = sc.nextLine();
// 处理价格输入的异常
double price;
while (true) {
System.out.print("请输入电影优惠价格:");
try {
price = sc.nextDouble();
sc.nextLine(); // 关键:处理nextDouble后的换行符
break;
} catch (Exception e) {
System.out.println("请输入有效的数字(如:39.9)!");
sc.nextLine(); // 清空错误输入
}
}
System.out.print("请输入电影其他信息:");
String info = sc.nextLine();
// 创建电影对象(使用自增ID,避免重复)
Movie movie = new Movie(nextId++, name, price, info);
movieList.add(movie);
System.out.println("电影【" + name + "】上架成功!ID:" + (nextId – 1));
}
// 2. 查询全部电影
private void showAllMovies() {
System.out.println("\\n— 全部电影列表 —");
if (movieList.isEmpty()) {
System.out.println("暂无电影,请先上架电影!");
return;
}
for (Movie movie : movieList) {
System.out.println(movie);
}
}
// 3. 根据ID查询指定电影(补充输出逻辑 + 异常处理)
private void findMovieById() {
System.out.println("\\n— 根据ID查询电影 —");
if (movieList.isEmpty()) {
System.out.println("暂无电影,请先上架电影!");
return;
}
// 处理非数字ID输入
int id;
while (true) {
System.out.print("请输入要查询的ID:");
try {
id = sc.nextInt();
sc.nextLine();
break;
} catch (Exception e) {
System.out.println("请输入有效的数字ID!");
sc.nextLine();
}
}
// 遍历集合,查找匹配ID的电影
Movie targetMovie = null;
for (Movie movie : movieList) {
if (movie.getId() == id) {
targetMovie = movie;
break;
}
}
// 输出结果
if (targetMovie != null) {
System.out.println("查询到的电影信息:");
System.out.println(targetMovie);
} else {
System.out.println("未找到ID为【" + id + "】的电影!");
}
}
// 4. 根据ID删除指定电影(补充空集合判断 + 异常处理)
private void deleteMovieById() {
System.out.println("\\n— 根据ID删除电影 —");
if (movieList.isEmpty()) {
System.out.println("暂无电影,无需删除!");
return;
}
// 处理非数字ID输入
int id;
while (true) {
System.out.print("请输入要删除的ID:");
try {
id = sc.nextInt();
sc.nextLine();
break;
} catch (Exception e) {
System.out.println("请输入有效的数字ID!");
sc.nextLine();
}
}
// 遍历删除
for (int i = 0; i < movieList.size(); i++) {
Movie movie = movieList.get(i);
if (movie.getId() == id) {
movieList.remove(i);
System.out.println("ID为【" + id + "】的电影删除成功!");
return;
}
}
System.out.println("未找到ID为【" + id + "】的电影!");
}
}
代码三:电影测试类
package com.sy.movie;
/**
* 电影测试类
*/
public class MovieTest {
public static void main(String[] args) {
MovieManage movieManage = new MovieManage();
movieManage.showMenu();
}
}
三、核心总结
该电影管理系统是面向新手的入门级 CRUD(创建、读取、更新、删除)实战项目,核心解题思路和实现要点可总结为以下 3 点:
架构设计:面向对象 + 分层实现
- 用Movie实体类封装电影的 ID、名称、价格、信息等核心属性,通过 Getter/Setter 和toString()实现数据的封装与便捷展示;
- 用ArrayList作为动态容器存储电影对象,搭配自增nextId保证 ID 唯一性,解决删除后 ID 重复的问题;
- 分 “交互层(菜单)- 业务层(功能方法)- 数据层(实体 + 集合)” 实现,职责清晰、低耦合。
功能实现:核心操作 + 边界处理
- 核心功能:上架(接收输入→创建对象→存入集合)、全量查询(遍历集合打印)、ID 精准查询(遍历匹配→输出结果)、ID 删除(索引遍历→移除元素);
- 边界处理:所有功能先判断集合是否为空,输入环节增加非数字校验(try-catch),解决nextDouble()后的换行符陷阱,避免程序崩溃或功能异常。
体验优化:健壮性 + 易用性兼顾
- 健壮性:对用户非法输入(如字母代替数字)、空集合操作等场景做兜底处理,防止程序异常终止;
- 易用性:菜单式循环交互、明确的操作反馈(如 “上架成功”“未找到该 ID”)、自动生成 ID,降低用户操作成本。





