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
相关产品推荐
相关产品推荐

