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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:48:10