Java中for循环为何跳过最后一次迭代?循环次数异常排查
循环迭代异常:第三次for循环未按预期执行2次
问题说明
我的for循环在第三次迭代时本该执行2次,却只跑了1次。试过把Math.ceil的结果强制转成int,问题还是没解决。
代码与变量定义
初始变量
String [] words = {"Lorem","ipsum","dolor","sit","amet","consectetur","adipiscing","elit."}; int spaceCount = 7; int wordCount = 4;
循环逻辑代码
int start = 0; // 补充原代码未显式定义的变量 String output = ""; int j; while(wordCount > -1){ output += words[start]; System.out.println("output:" + output); System.out.println("spaceCount:" + spaceCount); System.out.println("wordCount:" + wordCount); start++; System.out.println("j<:" + Math.ceil((double)spaceCount/(double)wordCount)); for(j=0; j < Math.ceil((double)spaceCount/(double)wordCount); j++){ System.out.println("j:" + j); output += " "; spaceCount--; } wordCount--; }
实际运行结果
output:Lorem spaceCount:7 wordCount:4 j<:2.0 j:0 j:1 output:Lorem ipsum spaceCount:5 wordCount:3 j<:2.0 j:0 j:1 output:Lorem ipsum dolor spaceCount:3 wordCount:2 j<:2.0 j:0 output:Lorem ipsum dolor sit spaceCount:2 wordCount:1 j<:2.0 j:0 output:Lorem ipsum dolor sit amet,
期望运行结果
output:Lorem ipsum dolor spaceCount:3 wordCount:2 j<:2.0 j:0 j:1 output:Lorem ipsum dolor sit spaceCount:1 wordCount:1 j<:1.0 j:0 output:Lorem ipsum dolor sit amet,
问题原因与解决办法
核心问题
第三次while循环里,for循环的终止条件在执行过程中变了:
- 一开始
spaceCount=3,wordCount=2,算出来Math.ceil(3/2)=2.0,所以for循环条件是j<2。 - 当j=0执行完,
spaceCount减到2,此时判断j=1是否满足j < Math.ceil(2/2)=1.0,1不小于1,循环直接停了,只跑了1次。
解决方法
提前把本次要加的空格数算好存起来,别让for循环的终止条件跟着spaceCount变:
修改后的代码:
int start = 0; String output = ""; int j; while(wordCount > -1){ output += words[start]; System.out.println("output:" + output); System.out.println("spaceCount:" + spaceCount); System.out.println("wordCount:" + wordCount); start++; // 提前计算本次需要添加的空格数,用临时变量存住 int spacesToAdd = (int) Math.ceil((double)spaceCount/(double)wordCount); System.out.println("j<:" + spacesToAdd); for(j=0; j < spacesToAdd; j++){ System.out.println("j:" + j); output += " "; spaceCount--; } wordCount--; }
这样每次while循环先确定好要加的空格总数,for循环只按这个固定值执行,就不会出现中途终止的情况,完全符合预期。
内容的提问来源于stack exchange,提问作者Jorge Gabriel
相关产品推荐
相关产品推荐

