public static void main(String[] args)
{
int [][]shatner = new int[1][1];
int []rat = new int[4];
shatner[0] = rat;
System.out.println(shatner[0][3]);
}
令人惊讶的是,输出结果为0,为什么Java不检查这种数组越界错误?
public static void main(String[] args)
{
int [][]shatner = new int[1][1];
int []rat = new int[4];
shatner[0] = rat;
System.out.println(shatner[0][3]);
}
令人惊讶的是,输出结果为0,为什么Java不检查这种数组越界错误?
不要感到惊讶。shatner[0]是一个数组(rat),长度为4。因此,shatner[0][3]是rat[3],它恰好是0。
int
数组(大小为1),即2D数组,内容初始化为0int
数组,内容初始化为0没有任何越界的情况。
shatner
数组中的第0行会被重新初始化为int[4]
。
并不是Java没有检查IndexOutOfBoundsException。问题在于答案应该是零。关键行是
shatner[0] = rat;
由于这意味着shatner
的第0个索引指向长度为4的数组,因此shatner[0][4]
是完全有效的。
没有数组越界错误。shatner是一个二维数组。你用长度为4的新数组替换了长度为1的第一个数组。所以现在shatner[0][3]是内存中合法的位置。
我认为这是因为Java的数组与预期有些不同。你将shatner
初始化为[1][1],意思是在内存中类似于{{0},{0}}
。
然而,你随后将一个整数赋给第一个元素,将其转换为在内存中类似于{{0,0,0,0},{0}}
,所以Java正在处理新分配的索引。
在Java中,数组不需要是矩形的。这是一个不规则数组,完全没有问题。
shatner[0]
并得到一场青蛙雨……或老鼠……或其他什么东西。 - Nate