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

Java中获取邮箱列表后循环仅处理首个元素,如何解决?

问题求助:Java循环仅处理List首元素,无法批量发送邮件

我编写了Java代码从数据库查询获取包含两个邮箱的List<UserDto>,预期返回格式为[email1, email2],但调用getEmail()方法的循环逻辑中始终仅处理索引为0的元素,无法依次给两个邮箱发送邮件。相关代码如下:

获取邮箱列表的代码

public List<UserDto> getEmail() {
    
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet searchResultSet = null;
    
    try {
        connection = getConnection();
        preparedStatement = connection.prepareStatement(
                        "SELECT EMAIL FROM USER WHERE USER.U_SEQ IN ('1','650')");
                
        searchResultSet = preparedStatement.executeQuery();
        return getEmail(searchResultSet);
    
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        try {
            if (preparedStatement != null) {
                preparedStatement.close();
            }
            if (searchResultSet != null) {
                searchResultSet.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}


private List<UserDto> getEmail(ResultSet searchResultSet) throws SQLException {
    List<UserDto> result = new ArrayList<UserDto>();
    UserDto userDto = null;
  
    while (searchResultSet.next()) {
        userDto = new UserDto();
        userDto.setEmailAddress(searchResultSet.getString(1));
        result.add(userDto);
     }
     return result;
}

调用方法的代码

Delegate delegate = new Delegate();
List<UserDto> users = iimDelegate.getEmail();
for (int i = 0; i < users.size(); i++) {
    String ToEmail = users.get(i).toString();
    delegate.sendNotification("****", "****", toEmail, "", "", "", body);
}

问题分析与解决方案

核心问题1:变量名大小写不匹配(编译级错误)

Java是大小写敏感语言,代码中定义的变量是ToEmail(大写T),但调用sendNotification时传入的是toEmail(小写t),这会导致编译错误,实际运行时代码根本无法正常执行循环。

核心问题2:错误使用toString()获取邮箱地址

users.get(i).toString()如果没有重写UserDto的toString()方法,返回的是对象的默认哈希字符串(如com.example.UserDto@123456),而非实际邮箱地址。应该直接调用getEmailAddress()方法获取邮箱值。

次要问题:资源未完全关闭

原代码的finally块仅关闭了PreparedStatement,未关闭ResultSet和Connection,可能导致数据库连接泄漏,需要补充资源关闭逻辑。

修正后的调用代码

Delegate delegate = new Delegate();
List<UserDto> users = iimDelegate.getEmail();
// 使用增强for循环更简洁直观
for (UserDto user : users) {
    String toEmail = user.getEmailAddress();
    delegate.sendNotification("****", "****", toEmail, "", "", "", body);
}

额外建议

  • 先验证数据库查询是否确实返回两条数据:可以在getEmail方法中打印result.size()确认列表长度。
  • 重写UserDto的toString()方法(可选),方便调试:
@Override
public String toString() {
    return "UserDto{" +
            "emailAddress='" + emailAddress + '\'' +
            '}';
}

内容的提问来源于stack exchange,提问作者uma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:00:57