ArrayList元素消失问题求助:添加成功却输出空值
问题分析与解决方案
你遇到的问题是个非常典型的引用逻辑错误——你只在循环外创建了一个Shop对象,之后在循环里反复修改它的属性,再把同一个对象的引用重复添加到列表中。这会导致你的listShops里的78个元素,全都是指向同一个currShop对象的引用,而非78个独立的Shop实例。
为什么会输出空字符串?
当while循环结束后,ResultSet已经走到了结果集的末尾,此时如果这个唯一的currShop对象的属性被隐式操作(比如数据库连接关闭后关联资源释放)或你代码中未展示的后续逻辑修改为空白,那么列表里所有引用指向的都是这个已经“变空”的对象,自然遍历的时候会输出78个空字符串。而你在循环内打印currShop.getName()能得到正确值,是因为每次循环时你刚给这个对象赋完当前行的正确数据,它的状态还没被后续操作改变。
修正后的代码
你需要在每次循环内部创建新的Shop对象,让每个列表元素都是独立的实例,各自保存对应行的数据:
ArrayList<Shop> listShops = new ArrayList<Shop>(); String query = "SELECT * FROM Shop WHERE... "; try { PreparedStatement statement = connection.prepareStatement(query); ResultSet rs = statement.executeQuery(); while(rs.next()) { // 每次循环都创建新的Shop实例,保证每个元素独立 Shop currShop = new Shop(); currShop.setName(rs.getString(1)); currShop.setDescription(rs.getString(2)); listShops.add(currShop); // 这里验证的话,也能看到每个实例的正确值 System.out.println(currShop.getName()); } } catch (SQLException e) { e.printStackTrace(); } System.out.println("List size: "+listShops.size()); for(Shop s: listShops) { System.out.println(s.getName()); }
关键说明
- 原写法中,所有列表元素共享同一个
currShop对象的引用,任何对这个对象的修改都会同步影响列表里的所有元素。 - 修改后,每次循环生成新的
Shop实例,每个实例保存当前行的数据,彼此独立,遍历的时候就能输出各行的正确内容了。
内容的提问来源于stack exchange,提问作者AlessandroF
相关产品推荐
相关产品推荐

