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

Java控制台项目:返回主菜单后Room的ArrayList数据丢失问题求解

问题分析与解决方案

嘿,我一眼就瞅出问题所在啦!你每次返回主菜单再进入Room子菜单时,之前保存的房间数据凭空消失,核心原因是每次进入Room菜单都会创建一个全新的RoomT对象,旧对象里的ArrayList数据跟着被丢弃了。

具体原因拆解:

看你App.java里的case 1分支,这段代码是罪魁祸首:

case 1 : 
    Scanner num = new Scanner(System.in);
    RoomT room = new RoomT(); // 每次进Room菜单都新建一个RoomT实例
    int choicech;
    do{
        // ... 子菜单逻辑
    }while(choicech<3);
    break;

每次用户选择进入Room菜单,都会生成一个全新的RoomT对象,这个新实例里的dbRoom是空的ArrayList,而之前保存的数据都在旧的RoomT对象里——当你返回主菜单时,旧对象会被Java的垃圾回收机制清理掉,所以再次进入Room菜单查看时,自然看不到之前的数据。

修复方案:

把RoomT的实例化移到主循环外面,让整个程序运行期间只有一个RoomT对象,这样数据就能持久保存了。同时顺便优化一下Scanner的问题(你用了多个Scanner,容易出现输入异常)。

修改后的App.java代码如下:

package com.hotel.app;
import com.hotel.room.*;
import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        int choice;
        Scanner input = new Scanner(System.in);
        // 把RoomT实例移到主循环外,全局复用一个对象
        RoomT room = new RoomT(); 
        do{
            System.out.println("1. For Room Menu. ");
            System.out.println("0. For quit programs. ");
            choice = input.nextInt();
            // 处理nextInt()后的换行符,避免后续nextLine()读取空字符串
            input.nextLine();
            switch(choice){
                case 0 : 
                    System.exit(0);
                    break;
                case 1 : 
                    int choicech;
                    do{
                        System.out.println("_______________ROOM MENU_________________________");
                        System.out.println(" 1. Save a room.");
                        System.out.println(" 2. Display all rooms.");
                        System.out.println(" 0. <-back to main menu.");
                        System.out.println("_____________________________________________________");
                        choicech = input.nextInt();
                        input.nextLine(); // 同样处理换行符,避免输入异常
                        switch(choicech){
                            case 0 : 
                                choicech = 5;
                                break;
                            case 1 : 
                                room.save();
                                break;
                            case 2 : 
                                room.display();
                                break;
                            default : 
                                System.out.println("Incorrect Choice!!!.");
                                break;
                        }
                    }while(choicech<3);
                    break;
                default : 
                    System.out.println("Incorrect!!");
                    break;
            }
        }while(choice<2);
    }
}

另外,你的RoomT里用了两个Scanner,其实完全可以只用一个,避免潜在的输入问题,修改RoomT.java的Scanner部分:

import java.util.ArrayList;
import java.util.Scanner;

public class RoomT implements IRoom{
    Scanner input = new Scanner(System.in);
    public ArrayList<Room> dbRoom = new ArrayList<>();
    Room room; // 不需要提前实例化,save方法里再创建就行

    public void save(){
        System.out.println("Id : ");
        String id = input.nextLine();
        System.out.println("Price : ");
        float price = input.nextFloat();
        input.nextLine(); // 处理nextFloat后的换行符,避免影响下一次输入
        room = new Room(id, price);
        dbRoom.add(room);
    }

    public void display(){
        if(dbRoom.isEmpty()){
            System.out.println("Room not saved yet!!!");
        }else{
            for(Room room: dbRoom){
                System.out.println("____________________________________________");
                System.out.println(room.toString());
                System.out.println("____________________________________________");
            }
        }
    }
}

修复后效果:

现在无论你多少次进出Room子菜单,RoomT对象都是同一个,dbRoom里的数据会一直保留,不会再出现返回主菜单后数据丢失的情况啦!

内容的提问来源于stack exchange,提问作者Mp. Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:40:14