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

