You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:24:27