2010-04-26 55 views
3
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代碼如何工作?

+2

這樣的最後一個元素,則發佈一個絕對回答毫無疑問?在StackOverflow上,通常問題首先出現。 – 2010-04-26 13:42:09

+0

我想這個問題是假設 - 「爲什麼這樣?」 – Bozho 2010-04-26 13:43:46

+1

這是一個完全合法的問題。 – 2010-04-26 13:44:35

回答

6

不要驚訝。夏特納[0]是一個數組(大鼠)和恰好是長度爲4的所以shartner [0] [3]是大鼠[3]這恰好是0 ..

+0

嗨nc3b: 所以shatner [0]可以分配給任何大小的int數組? 和int [1] [1]是什麼意思?一個int [1]的數組? – chun 2010-04-26 13:55:52

+1

@chun - int [1] [1]聲明設置數組的初始維數,該數組基本上是包含單個元素的單個數組的數組。該賦值將其更改爲包含4個元素的單個數組的數組。在Java中,多維數組對於每一行可以有不同的長度。 – justkt 2010-04-26 14:41:44

4

沒有什麼會出界。

shatner數組中的第0行被初始化爲int[4]

3

沒有索引超出界限的錯誤。 shatner是一個數組數組。你用長度爲4的新長度替換了第一個長度爲1的數組。所以現在shatner [0] [3]在記憶中是一個完全合法的地方。

3

這並不是說Java不檢查IndexOutOfBoundsException。這就是答案應該是零。關鍵行是

shatner[0] = rat; 

自那意味着shatner第0索引指向長度爲4的陣列,shatner[0][4]是完全有效的。

0

我想這是因爲Java的陣列不同的工作有點超出預期。您將shatner初始化爲[1] [1],意思就像內存中的{{0},{0}}

然而,隨後再爲其分配一個整數的第一個元素,把它變成在內存{{0,0,0,0},{0}},所以Java是解決新分配的指數。

+0

其實在內存中你有一個指向int數組的引用數組。在內存中,數組的集羣不需要,也很可能不會彼此相鄰。特別是在他將第一個重新分配給老鼠之後。 – 2010-04-26 13:49:39

+0

int [1] [1]是什麼意思?一個int [ANYSIZE]數組? – chun 2010-04-26 14:03:05

0

數組不需要是Java中的矩形。這是一個鋸齒狀的陣列,非常好。

+0

我認爲是鋸齒狀的,第一個shatner必須有兩排,而且它們的長度不相等。這個變量只有1行。 – Phil 2010-04-26 13:51:50

+0

它在技術上仍然是一個鋸齒狀的陣列,即使它在抽出時看起來不像一個。 – 2010-04-26 13:57:52

5

你在哪裏看到的「indexOutOfBound錯誤」?該代碼執行以下操作:

  • Initalize一個int陣列(尺寸1),即2D陣列的陣列(尺寸1),內容物用0
  • Initalize一個陣列的int,大小4,內容intialized被intialized 0
  • 2D陣列的單個元件尺寸設定爲4維數組
  • 訪問二維陣列中的第一陣列,其是0