容易马虎的list.add(对象)

本文探讨了如何使用SQL查询获取消息列表,并通过实例展示了如何将查询结果转换为消息对象列表,同时处理了异常情况。

public List<Message> getAllMessage(String sql,String[] args) throws Exception {
  // TODO Auto-generated method stub
  
  ResultSet  rs = this.executeQuery(sql, args);
   
  List<Message> list = new ArrayList<Message>();
//  Message message = new Message();   //2处
  try {
   while(rs.next())
   {
    Message message = new Message();               //1处
    message.setId(rs.getInt("id"));
    message.setName(rs.getString("name"));
    message.setPhone(rs.getString("phone"));
    message.setEmail(rs.getString("email"));
    message.setTitle(rs.getString("title"));
    message.setContent(rs.getString("content"));
    System.out.println(message.getId()+"-------------");
    list.add(message);
   }
   
   for (Message a : list) {
    System.out.println(a.getId()+"aaaaaaaaaaaaaaaaaaa");
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw new Exception(" com.webbook.impl.MessageDaoImpl.public List<Message> getAllMessage(String sql,String[] args)方法异常",e);
  }
 
  return list;
 }

 

如果把1处注释掉,2处放开,结果会反复出现最后一条数据。

### Java List 迭代过程中删除元素的影响及结果 在 Java 中,当尝试从 `List` 集合中删除元素时,尤其是在迭代过程中执行删除操作,可能会引发一些意外行为或异常。以下是对此现象的具体分析。 --- #### 1. 使用增强型 for 循环删除元素 如果使用增强型 for 循环(foreach loop)来遍历列表并试图从中删除元素,通常会导致抛出 `ConcurrentModificationException` 异常。这是因为增强型 for 循环内部依赖于隐式的迭代器对象,在每次循环迭代前都会检查集合结构是否被修改过[^1]。一旦检测到未经允许的结构性修改(如调用 `list.remove()` 方法),就会触发该异常。 ```java for (String str : list) { if ("d".equals(str)) { list.remove(str); // 报错:java.util.ConcurrentModificationException } } ``` 此代码片段展示了这种情况下发生的错误。首次移除操作可能成功完成,但在后续迭代期间再次尝试访问已更改的集合状态时便会失败。 --- #### 2. 使用显式 Iterator 删除元素 为了避免上述问题,推荐采用显式创建的 `Iterator` 来管理删除逻辑。通过这种方式不仅可以安全地进行条件性删除,而且不会破坏当前正在进行中的迭代流程[^3]。 ```java Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String str = iterator.next(); if ("d".equals(str)) { iterator.remove(); // 正确做法 } } ``` 这里的关键在于利用了 `Iterator` 的内置机制——其维护了一个指向最近返回项之后位置的游标指针,并且提供了专属的方法 (`remove()`) 来处理正在遍历的对象上的变更请求[^3]。因此即使发生了某些形式的数据结构调整也不会影响整个枚举过程继续正常运作下去。 值得注意的是,尽管这种方法能够有效防止并发修改例外状况的发生,但它仍然不允许同时存在多个活跃态的 Iterators 实例针对同一个底层数组实例做独立控制权下的变动动作[^2]。也就是说如果你在一个线程里启动两个不同的 Iterators 并分别对他们所代表的基础容器实施写入类别的命令的话还是有可能遭遇同步方面的问题除非额外采取措施保障资源独占使用权比如加锁等等... --- #### 总结 综上所述,在 Java 编程语言环境下对于 Lists 类型的数据结构而言,直接运用标准 For-each Loop 构造去实现动态剔除成员的动作是非常危险的行为因为很容易造成程序崩溃;相较之下借助专门设计用来配合此类场景需求使用的工具类 - Iterator 则显得更加稳妥可靠得多同时也遵循良好的编码实践原则即总是优先选用官方文档明确定义支持的功能特性而非自行摸索潜在风险较高的替代方案。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值