Java 11邮件发送代码出现无限循环问题,求逻辑解析
邮件发送代码中while循环无法终止的逻辑原因分析
核心问题:循环条件逻辑完全颠倒
你的while循环条件while (!success || nTries >= nMaxTries)与预期的重试逻辑完全相反,这是触发无限循环的根本原因。
正确的重试逻辑应该是:
只要邮件未发送成功,并且尝试次数还未达到最大值,就继续重试。对应的条件应为:
while (!success && nTries < nMaxTries)
错误条件引发的具体问题:
成功后触发无限重复发送
- 假设前5次发送全部失败,
nTries会被递增到5(仅在catch块中计数),此时success仍为false。 - 第6次发送成功后,
success被设为true,但nTries保持为5,此时循环条件!success(false) || nTries >= nMaxTries(true)结果为true,循环继续执行。 - 后续每次循环中,
success始终为true,nTries始终为5,循环条件永远满足,代码会无限重复发送邮件,这就是你看到近40万封重复邮件的直接原因。
- 假设前5次发送全部失败,
持续失败时无限重试
- 如果所有尝试都失败,
success永远为false,不管nTries涨到多大,!success始终为true,循环条件永远成立,代码会无限制重试发送。
- 如果所有尝试都失败,
次要问题:计数器仅在失败时递增
你的nTries只有在发送失败(进入catch块)时才会递增,成功时不更新计数器:
- 成功后计数器停留在之前失败的次数上,结合错误的循环条件,直接触发无限循环。
- 无法准确统计总尝试次数,不符合重试逻辑的计数需求。
修复方案
- 修正循环条件为正确逻辑:
while (!success && nTries < nMaxTries)
- 调整计数器递增时机,无论成功失败都更新次数:
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
相关产品推荐
相关产品推荐

