Java二维数组嵌套for循环不同length条件下索引输出结果疑问
Java不规则二维数组内层循环执行逻辑讲解
首先明确你定义的二维数组结构:
你声明的是不规则二维数组,外层数组长度为3,三个子数组的长度各不相同:
x[0]:长度为2,合法索引为0、1x[1]:长度为1,合法索引为0x[2]:长度为3,合法索引为0、1、2
双层for循环的基础执行逻辑是:外层循环先固定变量i的值(从0依次递增到2,共3轮外层循环),每一轮外层循环中,内层循环变量j从0开始递增,直到不满足内层循环条件时退出内层,再进入下一轮外层循环。
你遇到的输出和预期不符,核心是两个认知偏差:
- 内层循环的条件是固定值,会作用在每一轮外层循环上,不是只作用在对应索引的子数组上
- 当访问
x[i][j]时,如果j超过了当前i对应子数组的最大合法索引,会直接抛出ArrayIndexOutOfBoundsException异常,程序立即终止,后续的循环和输出都不会执行
接下来逐个分析你的三个测试场景:
场景1:内层循环条件为j < x[1].length
x[1].length的值是固定的1,也就是说每一轮外层循环中,j只能取0就会退出内层循环:
- i=0:j=0,合法,输出
0 0 - i=1:j=0,合法,输出
1 0 - i=2:j=0,合法,输出
2 0
所有循环执行无异常,最终输出就是你看到的三组索引。
场景2:内层循环条件为j < x[2].length
x[2].length的值是固定的3,也就是说内层循环会尝试让j取0、1、2三个值:
- i=0,j=0:合法,输出
0 0 - i=0,j=1:合法,输出
0 1 - i=0,j=2:尝试访问
x[0][2],但x[0]的最大索引是1,直接抛出数组越界异常,程序终止
所以你只能看到前两组0 0、0 1的输出,后续循环都没有执行。
场景3:内层循环条件为j < x[0].length
x[0].length的值是固定的2,也就是说内层循环会尝试让j取0、1两个值:
- i=0,j=0:合法,输出
0 0 - i=0,j=1:合法,输出
0 1 - i=1,j=0:合法,输出
1 0 - i=1,j=1:尝试访问
x[1][1],但x[1]的最大索引是0,直接抛出数组越界异常,程序终止
所以你只能看到前三组索引输出,i=2的循环完全没有执行。
如果你想要只遍历某一行的元素,需要把外层循环的范围改成只遍历对应索引的i值,而不是修改内层循环的判断条件,否则就会出现上述的越界或不符合预期的输出。
内容的提问来源于stack exchange,提问作者mxyx
相关产品推荐
相关产品推荐

