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

拆分Java类后无法向ArrayList添加对象,请求代码问题排查

问题排查:拆分OOP类后无法向ArrayList添加元素

问题根源

你的代码中存在两个独立的Calculator实例:

  • Main类中创建了一个Calculator calc对象
  • UserInterface的构造方法里又新建了另一个Calculator对象

UI中调用calculator.addNumber()时,操作的是它内部自己创建的Calculator实例;而Main类打印的是另一个完全独立的实例,所以输出为空列表,看起来像是元素没被添加。

修复方案

修改UserInterface的构造方法,改为接收外部传入的Calculator实例,确保整个程序共享同一个对象:

修改后的Main类代码

public class Main {
    public static void main(String[] args) {
        // 先创建Calculator实例
        Calculator calc = new Calculator();
        // 将该实例传入UserInterface
        UserInterface ui = new UserInterface(calc);

        ui.start();
        System.out.println(calc.getNumbers());
    }
}

修改后的UserInterface类代码

import java.util.Scanner;

public class UserInterface {
    private Calculator calculator;
    private Scanner scanner;

    // 构造方法接收外部传入的Calculator实例
    public UserInterface(Calculator calculator) {
        this.calculator = calculator;
        scanner = new Scanner(System.in);
    }

    public void start() {
        int input;
        while (true) {
            System.out.println("Enter point totals, -1 stops:");
            input = scanner.nextInt();
            if (input == -1) {
                break;
            }
            if (input >= 0 && input <= 100) {
                calculator.addNumber(input);
            }
        }
    }
}

Calculator类保持不变

import java.util.ArrayList;

public class Calculator {
    private final ArrayList<Integer> numbers;

    public Calculator() {
        numbers = new ArrayList<>();
    }

    public void addNumber(int number) {
        numbers.add(number);
    }

    public ArrayList<Integer> getNumbers() {
        return numbers;
    }
}

修复原理

通过依赖注入的方式,让UserInterface使用外部提供的Calculator实例,确保Main和UI操作的是同一个对象。这样UI中添加的元素会被存储到Main类持有的Calculator实例的ArrayList中,最终打印时就能看到正确的结果。

内容的提问来源于stack exchange,提问作者Lirzhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:52:27