Java Swing如何在两个JFrame之间访问传递ArrayList实例
问题原因
- 静态变量初始化时机异常:你将
empList定义为addEmployee类的静态变量,它只有在addEmployee的构造方法执行时才会被实例化。如果payroll窗口的创建早于addEmployee构造方法执行,此时addEmployee.empList的值为null,遍历调用empList.size()时就会抛出NullPointerException空指针异常。 - 局部变量作用域错误:你在
payroll的构造方法中重新定义了局部变量empList,该变量仅在构造方法内部生效。如果遍历代码写在构造方法外部,访问的要么是未定义的类成员变量,要么是空值,也会触发报错。 - 额外风险:静态全局集合如果被多个窗口同时修改,还可能触发并发修改异常。
解决方案
快速修复方案
调整静态变量初始化逻辑,同时修正变量作用域问题:
- 修改
addEmployee类代码,在静态变量声明时直接完成初始化,不依赖构造方法执行:
public class addEmployee extends javax.swing.JFrame { // 声明时直接初始化,无需等待构造方法调用 public static ArrayList<EmployeeClass> empList = new ArrayList<>(); public addEmployee() { initComponents(); // 删除构造方法内的empList初始化逻辑 } }
- 修改
payroll类代码,将集合定义为类成员变量,保证全类方法可访问:
public class payroll extends javax.swing.JFrame { // 定义为类成员变量 private ArrayList<EmployeeClass> empList; public payroll() { initComponents(); // 赋值给成员变量,不要重新定义局部变量 this.empList = addEmployee.empList; } // 遍历示例 public void traverseEmpList() { for(int i = 0 ; i<empList.size() ; i++){ // 业务逻辑实现 } } }
规范优化方案(推荐)
不使用静态变量传值,通过构造方法依赖注入的方式传递集合,避免全局状态污染:
- 修改
addEmployee类代码,将集合改为成员变量,打开payroll窗口时作为参数传入:
public class addEmployee extends javax.swing.JFrame { private ArrayList<EmployeeClass> empList = new ArrayList<>(); // 打开payroll窗口的触发逻辑 public void openPayroll() { payroll payrollWindow = new payroll(empList); payrollWindow.setVisible(true); } }
- 修改
payroll类构造方法,接收外部传入的集合:
public class payroll extends javax.swing.JFrame { private ArrayList<EmployeeClass> empList; // 改造构造方法接收参数 public payroll(ArrayList<EmployeeClass> empList) { initComponents(); this.empList = empList; } }
内容的提问来源于stack exchange,提问作者Mirza Viraad Baig
相关产品推荐
相关产品推荐

