Java中捕获异常后继续执行for循环的实现方法
解决方案:捕获单条发送异常,继续处理剩余收件人
这问题太常见了——批量处理邮件时最怕单个失败导致全流程中断。你只需要把单个收件人的发送逻辑包裹在try-catch块里,这样即使某一封发送失败,程序会记录错误然后继续处理下一个收件人。
修改后的代码示例
import javax.mail.MessagingException; // 记得导入必要的异常类 if (Recipients_To != null) { for (int i = 0; i < Recipients_To.length; i++) { String recipient = Recipients_To[i].toString(); // 重置收件人(如果复用同一个message对象,这一步很关键) message.setRecipients(Message.RecipientType.TO, recipient); try { Transport.send(message); // 可选:打印成功日志,方便追踪进度 System.out.println("✅ 邮件已成功发送给:" + recipient); } catch (MessagingException e) { // 捕获发送异常,只终止当前收件人的处理,不中断循环 System.err.println("❌ 发送邮件给 " + recipient + " 失败:" + e.getMessage()); // 可选:打印完整堆栈轨迹,用于调试问题根源 // e.printStackTrace(); } } }
关键注意事项
- 复用Message对象的坑:如果你一直在用同一个
message实例,每次循环必须用setRecipients覆盖之前的收件人,否则可能会把邮件发给之前的收件人(或者出现其他奇怪的问题)。如果你的邮件有个性化内容(比如不同的正文、标题),建议在循环内部新建Message实例,避免状态残留。 - 精准捕获异常:尽量捕获具体的
MessagingException(JavaMail库的异常),而不是笼统的Exception,这样不会意外捕获其他无关异常。 - 日志记录:一定要记录失败的收件人信息,后续可以手动补发或者排查问题(比如邮箱地址无效、服务器拒绝连接等)。
- 频率限制:给500+收件人发邮件时,建议在循环里加个小延迟(比如
Thread.sleep(1000),即1秒),避免触发邮件服务器的频率限制,被判定为垃圾邮件。
内容的提问来源于stack exchange,提问作者im_mangesh
相关产品推荐
相关产品推荐

