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

Java修改实例变量ArrayList后其他方法读取为空的解决办法

问题核心原因
  • 你在addCar()方法第一行就创建了新的CarManager实例myCarManager,所有后续的递归调用、跳转菜单操作都是在这个新实例上执行的,而你当前操作的原CarManager实例的carList根本没有被后续操作使用,所以你在其他方法读取原实例的列表时自然是空的。
  • 你不需要在类的内部方法里重复创建当前类的实例,直接用this指代当前实例就可以。
修复步骤
  1. 删掉addCar()方法第一行的CarManager myCarManager= new CarManager();代码
  2. 所有原来调用myCarManager.xxx()的地方,直接替换成调用当前实例的方法,也可以直接省略this.前缀
  3. 调整递归逻辑和跳转逻辑,避免创建不必要的实例

修复后的addCar方法参考:

public void addCar () {
    // 移除多余的新实例创建代码
    Car car1 = new Car(carId,driver,sizeCategory);
    carId= car1.getCarId(carId);
    driver= car1.getDriver (driver);
    sizeCategory= car1.getSizeCategory (sizeCategory);
    
    System.out.println("You entered the following data:");
    System.out.println("\ncar ID: "+ carId);
    System.out.println("driver's name:" +driver);
    System.out.println("size category: "+sizeCategory);
    System.out.println("\nIf you are okay with this, press 0 to save the data and return to the CARS MENU");
    System.out.println("\nIf you made a mistake, press 1 to enter the data again");
    Scanner afterAddCar= new Scanner(System.in);
    String choice1 = afterAddCar.next().trim();
    
    if ("1".equals (choice1)) {
        // 直接调用当前实例的addCar,不要用新实例
        addCar();
    }
    
    if ("0".equals (choice1)) {
        Car returnedCar= new Car (carId,driver,sizeCategory);
        carList.add(returnedCar);
        String list = carList.toString();
        System.out.println("已添加车辆,当前列表:" + list);
        // 直接调用当前实例的handleCars,不需要重复调用setCarList赋值
        handleCars();
    }
}
额外优化建议(可选)
  • Car类里的getCarId、getDriver、getSizeCategory的设计不符合JavaBean规范,getter方法应该是无参数,直接返回当前对象的属性值,你现在把读取用户输入的逻辑写在getter里非常容易产生混淆,建议把读取输入的逻辑抽到CarManager里,或者单独命名为inputCarId这类方法名避免误解。
  • Scanner不需要每次都创建新的,可以整个类共用一个Scanner实例,避免资源浪费。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:15:03