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不檢查這種indexOutOfBound錯誤的?此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不檢查這種indexOutOfBound錯誤的?此Java代碼如何工作?
沒有什麼會出界。
的shatner
數組中的第0行被初始化爲int[4]
。
沒有索引超出界限的錯誤。 shatner是一個數組數組。你用長度爲4的新長度替換了第一個長度爲1的數組。所以現在shatner [0] [3]在記憶中是一個完全合法的地方。
這並不是說Java不檢查IndexOutOfBoundsException。這就是答案應該是零。關鍵行是
shatner[0] = rat;
自那意味着shatner
第0索引指向長度爲4的陣列,shatner[0][4]
是完全有效的。
我想這是因爲Java的陣列不同的工作有點超出預期。您將shatner
初始化爲[1] [1],意思就像內存中的{{0},{0}}
。
然而,隨後再爲其分配一個整數的第一個元素,把它變成在內存{{0,0,0,0},{0}}
,所以Java是解決新分配的指數。
其實在內存中你有一個指向int數組的引用數組。在內存中,數組的集羣不需要,也很可能不會彼此相鄰。特別是在他將第一個重新分配給老鼠之後。 – 2010-04-26 13:49:39
int [1] [1]是什麼意思?一個int [ANYSIZE]數組? – chun 2010-04-26 14:03:05
數組不需要是Java中的矩形。這是一個鋸齒狀的陣列,非常好。
我認爲是鋸齒狀的,第一個shatner必須有兩排,而且它們的長度不相等。這個變量只有1行。 – Phil 2010-04-26 13:51:50
它在技術上仍然是一個鋸齒狀的陣列,即使它在抽出時看起來不像一個。 – 2010-04-26 13:57:52
你在哪裏看到的「indexOutOfBound錯誤」?該代碼執行以下操作:
int
陣列(尺寸1),即2D陣列的陣列(尺寸1),內容物用0int
,大小4,內容intialized被intialized 0
這樣的最後一個元素,則發佈一個絕對回答毫無疑問?在StackOverflow上,通常問題首先出現。 – 2010-04-26 13:42:09
我想這個問題是假設 - 「爲什麼這樣?」 – Bozho 2010-04-26 13:43:46
這是一個完全合法的問題。 – 2010-04-26 13:44:35