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

