2013-07-05 38 views
-2

最後一個for循環將編譯,但不會運行。它說數組索引越界異常:17。我只是想一個ColorRectangles(ColorShape的子類)17'th行二維數組和超出範圍例外

private ColorShape[][] _tiles; 

public GamePanel() 
{ 
    _tiles = new ColorShape[8][17]; 

    for (int i = 0; i<16; i++){ 
      for(int j=0; j<8;j++){ 
       _tiles[j][i] = null; 
      } 
    } 

    for (int j=0; j<8;j++){ 
      _tiles[j][17] = new ColorRectangle(Color.BLACK); 

    } 
} 
+2

它應該是:'_tiles [J]。[16]'。用設計改進編輯 –

回答

0

你的數組大小17.數組是零索引的。這意味着你的第二個維度的最大數組索引實際上是16,不是17

要麼改變你的參考磚:

_tiles[j][16] = new ColorRectangle(Color.BLACK); 

或者使你_tiles陣列更大,像這樣:

_tiles = new ColorShape[8][18]; 

要麼解決這個問題。

我還可以建議您的遊戲面板對象接受2維度,寬度和高度。如果您決定再次使用它或者更改其尺寸,這會使您的課程變得更加實用。在適當的時候避免硬編碼值。這裏最合適。

這裏有一個重寫你:

private ColorShape[][] _tiles; 

public GamePanel(int width, int height) 
{ 
    _tiles = new ColorShape[width][height]; 

    for (int i = 0; i<height; i++){ 
     for(int j=0; j<width;j++){ 
      _tiles[j][i] = null; 
     } 
    } 

    for (int j=0; j<width;j++){ 
     _tiles[j][tiles[j].length-1] = new ColorRectangle(Color.BLACK); 

} 
} 

而且這裏是你將如何使用它,你的情況:

GamePanel panel = new GamePanel(8, 17); 

但你總是很容易,現在改變你的面板尺寸!

GamePanel panel = new GamePanel(100,100); 

漂亮的吧?

+0

。一探究竟。 –

0

在加入到1-8列本:

_tiles[j][17] = new ColorRectangle(Color.BLACK); 

17不是因爲你的陣列的有效指標你把它定爲[8][17]。指數是從0...length - 1,所以在你的情況下,多達16個。這是因爲在Java(和任何合理的編程語言)的數組是zero-indexed。因此,更換

_tiles[j][16] = new ColorRectangle(Color.BLACK); 

和至少你不會得到一個ArrayIndexOutOfBoundsException

我只想一個ColorRectangles(ColorShape的子類)加入到1-8列17'th行

看到,在一個從零開始的索引方案,第17行具有索引16

第一行對應於具有索引0。第二行對應於與索引1等。通常該行中,nth行對應於與索引n - 1和與行索引n實際上是(n + 1)th行(假設0 <= n < length - 1)。

0

你的問題是在這裏:

_tiles[j][17] = new ColorRectangle(Color.BLACK); 

你應該有這個代替(注意數組是零索引,所以第17列的索引爲16):

_tiles[j][16] = new ColorRectangle(Color.BLACK); 
0

在Java中,索引從零開始(0);

private ColorShape[][] _tiles; 

public GamePanel() 
{ 
    _tiles = new ColorShape[8][18]; // new dim is 18 so last index is 17 

    for (int i = 0; i<18; i++){ 
      for(int j=0; j<8;j++){ 
       _tiles[j][i] = null; 
      } 
     } 

    for (int j=0; j<8;j++){ 
      _tiles[j][17] = new ColorRectangle(Color.BLACK); //17 was out of bounds 

     } 
} 
0

您的數組的長度是[8][17]但指標去從[0][16]。爲此 更換

_tiles[j][17] = new ColorRectangle(Color.BLACK); 

_tiles[j][16] = new ColorRectangle(Color.BLACK); 
0

你宣佈與X系列的8個字段和Y範圍17場在你的代碼的數組:

_tiles = new ColorShape[8][17]; 

因爲你從IT開始從零開始計數,範圍從零到十六(0-16)。
所以如果你想要數組的最後一個字段,你必須使用字段16(_tiles[j][16])。

的代碼應該是:

_tiles[j][16] = new ColorRectangle(Color.BLACK); 

整個事情被稱爲zero-based-numbering/index

0

按照JLS (Array Access) - All arrays are 0-origin. An array with length n can be indexed by the integers 0 to n-1.

所以,如果你喜歡你做_tiles = new ColorShape[8][17];初始化數組。爲了訪問您需要通過0 to 70 to 16來完成。

現在,使用_tiles[j][17] = new ColorRectangle(Color.BLACK);您正在嘗試訪問某些內容已超出您已初始化的數組,因此您將獲得java.lang.ArrayIndexOutOfBoundsException

0

您可能還有第一個循環的錯誤。
代替
for (int i = 0; i<16; i++)
應該
for (int i = 0; i<17; i++)

數組是零索引的意思的起始索引爲0到長度-1。

所以,在你的情況下,可以達到16

對於你的第二個循環,它應該是

_tiles[j][16] = new ColorRectangle(Color.BLACK);