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

Java 11邮件发送代码出现无限循环问题,求逻辑解析

邮件发送代码中while循环无法终止的逻辑原因分析

核心问题:循环条件逻辑完全颠倒

你的while循环条件while (!success || nTries >= nMaxTries)与预期的重试逻辑完全相反,这是触发无限循环的根本原因。

正确的重试逻辑应该是:

只要邮件未发送成功,并且尝试次数还未达到最大值,就继续重试。对应的条件应为:

while (!success && nTries < nMaxTries)

错误条件引发的具体问题:

  1. 成功后触发无限重复发送

    • 假设前5次发送全部失败,nTries会被递增到5(仅在catch块中计数),此时success仍为false。
    • 第6次发送成功后,success被设为true,但nTries保持为5,此时循环条件!success(false) || nTries >= nMaxTries(true)结果为true,循环继续执行。
    • 后续每次循环中,success始终为true,nTries始终为5,循环条件永远满足,代码会无限重复发送邮件,这就是你看到近40万封重复邮件的直接原因。
  2. 持续失败时无限重试

    • 如果所有尝试都失败,success永远为false,不管nTries涨到多大,!success始终为true,循环条件永远成立,代码会无限制重试发送。

次要问题:计数器仅在失败时递增

你的nTries只有在发送失败(进入catch块)时才会递增,成功时不更新计数器:

  • 成功后计数器停留在之前失败的次数上,结合错误的循环条件,直接触发无限循环。
  • 无法准确统计总尝试次数,不符合重试逻辑的计数需求。

修复方案

  1. 修正循环条件为正确逻辑:
while (!success && nTries < nMaxTries)
  1. 调整计数器递增时机,无论成功失败都更新次数:
int nMaxTries = 5;
int nTries = 0;
boolean success = false;

while (!success && nTries < nMaxTries) {
    try {
        // 邮件发送逻辑...
        success = true;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // 无论结果如何,递增尝试次数
        nTries++;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:23:01