这个Java代码是如何工作的?

这个Java代码是如何工作的?,java,Java,令人惊讶的是,输出为0,为什么Java不检查这种IndexAutofBound错误?不要惊讶。shatner[0]是一个数组(rat),恰好长度为4。所以shartner[0][3]是老鼠[3],正好是0。没有什么超出范围 shatner数组中的第0行重新初始化为int[4]没有索引越界错误。shatner是一个数组数组。您将长度为1的第一个数组替换为长度为4的新数组。所以现在shatner[0][3]在记忆中是一个完全合法的地方 并不是Java没有检查IndexOutOfBoundsExcep

令人惊讶的是,输出为0,为什么Java不检查这种IndexAutofBound错误?

不要惊讶。shatner[0]是一个数组(rat),恰好长度为4。所以shartner[0][3]是老鼠[3],正好是0。

没有什么超出范围


shatner
数组中的第0行重新初始化为
int[4]

没有索引越界错误。shatner是一个数组数组。您将长度为1的第一个数组替换为长度为4的新数组。所以现在shatner[0][3]在记忆中是一个完全合法的地方

并不是Java没有检查IndexOutOfBoundsException。答案应该是零。关键是

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]);
}    

因为这意味着
shatner
的第0个索引指向长度为4的数组,
shatner[0][4]
是完全有效的。

我认为这是因为java的数组的工作方式与预期有点不同。您将
shatner
初始化为[1][1],这意味着类似于内存中的
{{0},{0}}


但是,您可以为第一个元素分配一个整数,将其转换为内存中的
{0,0,0,0},{0}}
,这样Java就可以寻址新分配的索引。

数组在Java中不必是矩形的。这是一个锯齿状数组,非常好。

您在哪里看到“indexOutOfBound错误”?该代码执行以下操作:

  • 初始化
    int
    数组(大小1)的数组(大小1),即2D数组,内容初始化为0
  • 初始化一个
    int
    数组,大小为4,内容初始化为0
  • 将二维数组的单个元素设置为大小为4 1D数组
  • 访问2D数组中第一个数组的最后一个元素,即0

那么,你发布了一个完全没有问题的答案?在StackOverflow上,问题通常排在第一位。我认为这个问题是假设的——“为什么会这样?”这是一个完全合理的问题。它可以被理解为一个问题——“为什么这个代码没有抛出IndexOutOfBoundsException?”不要错误地认为java数组是loke fortean 2d数组,实际上在内存中有一个指向int数组的引用数组。在内存中,阵列集群不需要,而且很可能不会彼此相邻。特别是在他将第一个分配给rat之后。int[1][1]是什么意思?一个int[ANYSIZE]数组?我认为是锯齿状的,第一个shatner必须有两行,它们的长度不相等。这个变量只有一行。从技术上讲,它仍然是一个锯齿状数组,即使它在绘制时看起来不像。hi nc3b:那么shatner[0]可以分配给任何大小的int数组吗?int[1][1]是什么意思?int[1]?@chun的一个数组-int[1][1]声明设置数组的初始维度,它基本上是包含单个元素的单个数组的数组。赋值将其更改为包含4个元素的单个数组的数组。在Java中,多维数组的每一行可以有不同的长度。
shatner[0] = rat;