Java程序中for循环迭代次数超出设定条件的问题排查
问题分析与解决方案
首先,咱们来拆解下你代码里的核心问题:你在for循环的循环体中修改了控制循环次数的变量n,这直接导致迭代次数完全失控!
为什么迭代次数会超出设定值?
原代码里,你初始化n=5作为循环的终止条件,但每次循环都会执行n=a*n,把n的值不断放大:
- 第一次循环:
a=1,n变成1*5=5,a自增到2 - 第二次循环:
a=2,此时n=5满足a<=n,执行后n=2*5=10,a自增到3 - 第三次循环:
a=3,n=10满足条件,n变成3*10=30,a自增到4 - 以此类推,
n的增长速度远快于a的自增速度,循环会一直跑下去,直到n因为整数溢出变成负数,此时正数a不再满足a<=n(负数),循环才会停止——这就是你看到一大堆输出的原因。
至于你说在自己笔记本上运行时迭代次数符合要求,大概率是当时的代码没修改循环变量n,或是某次运行的巧合~
修正后的代码
我们需要把初始迭代次数和计算用的变量分开,用单独的变量保存循环终止条件,同时可以改用long类型避免整数溢出:
public class Test { public static void main(String args[]) { int iterationCount = 5; // 单独存储迭代次数,全程不修改 long result = 1; // 用long类型避免数值溢出 for(int a=1; a<=iterationCount; a++ ) { result = a * result; System.out.println(result); } } }
运行这段代码,你会得到正好5次输出:1, 2, 6, 24, 120(如果你的需求是计算阶乘,这就是正确的结果)。
补充:关于整数溢出
你最后输出的-1899959296是int类型溢出导致的。Java里int的取值范围是-2147483648到2147483647,当数值超过这个范围时会发生溢出回绕,变成负数。如果需要处理更大的数值,可以用long甚至BigInteger类型。
内容的提问来源于stack exchange,提问作者Fazal Malik
相关产品推荐
相关产品推荐

