Java中退出while循环后如何保留数组内的Employee对象?
问题解决:保留Employee数组数据不丢失
问题根源
每次选择「进入数据库」时,都会新建一个EmployeesFunction对象,之前的对象及其内部的数组会被Java垃圾回收机制清理,所以再次进入时数据全部丢失。
解决方案
把EmployeesFunction的实例移到外层循环外部,确保整个程序运行期间只有一个实例,这样数组数据就能持续保留。同时调整EmployeesFunction的结构,把交互循环从构造函数里抽出来改成单独方法,避免实例化时直接进入循环。
修改后的代码
Main类
import javax.swing.*; public class Main { public static void main(String[] args) { // 在外层循环外创建唯一的EmployeesFunction实例 EmployeesFunction employeeManager = new EmployeesFunction(); while (true) { int opcion = Integer.parseInt(JOptionPane.showInputDialog(null, "(1) Enter to Database\n(2) Quit")); if (opcion == 1) { // 调用交互方法,而非新建实例 employeeManager.startDatabaseInteraction(); } else if (opcion == 2) { break; } } } }
EmployeesFunction类
import javax.swing.JOptionPane; public class EmployeesFunction { Employees array[] = new Employees[5]; // 构造函数仅负责初始化数组,不处理交互逻辑 public EmployeesFunction() { array[0] = new Employees("Name"); // 初始化第一个员工对象 } // 独立的交互循环方法 public void startDatabaseInteraction() { while (true) { int option = Integer.parseInt(JOptionPane.showInputDialog(null, "(1) Show list\n(2) Add new employee\n(3) Quit")); if (option == 1) { showEmployeesList(); } else if(option == 2) { addNewEmployee(); } else if (option == 3) { break; } } } public void addNewEmployee() { // 修复原逻辑:从前往后找第一个可用位置(空/未激活) for (int i = 0; i < array.length; i++) { if (array[i] == null || !array[i].isActive()) { String name = JOptionPane.showInputDialog(null, "Write name"); if (array[i] == null) { array[i] = new Employees(name); } else { array[i].setName(name); array[i].setActive(true); } JOptionPane.showMessageDialog(null, "Employee added successfully"); return; } } // 数组已满的提示 JOptionPane.showMessageDialog(null, "Database is full, cannot add more employees"); } public void showEmployeesList() { String list = ""; for (int i=0; i<array.length; i++) { // 只显示活跃的员工对象 if (array[i] != null && array[i].isActive()) { list += array[i].getName() + "\n"; } } JOptionPane.showMessageDialog(null, list.isEmpty() ? "No active employees" : list); } }
Employees类(无需修改)
public class Employees { private String name; private boolean active; public Employees() { this.name = ""; this.active = false; } public Employees(String name) { this.name = name; this.active = true; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; } }
关键修改说明
- 全局单一实例:
EmployeesFunction实例在程序启动时创建一次,后续仅调用其交互方法,数组数据全程不会被销毁。 - 分离构造与业务逻辑:把原构造函数里的交互循环抽成独立方法,避免实例化时直接进入循环的不合理设计。
- 修复添加逻辑:原
addNewEmployee方法存在数组越界、逻辑混乱问题,现在改为从前往后找第一个可用位置添加,同时处理数组已满的边界情况。 - 优化列表显示:仅展示活跃员工,避免空对象或未激活对象的无效显示。
内容的提问来源于stack exchange,提问作者Binjie Liang
相关产品推荐
相关产品推荐

