2012-03-02 133 views
1

我在「calendarTable [i] [j] = str;」上遇到越界異常下面一行。我覺得這很有趣,因爲我將它初始化爲15,而且我只迭代到14次。我嘗試初始化爲20000,無論我創建的數組多大,它仍然會得到索引超出界限的錯誤。Java數組 - 在初始化數組上發生越界異常

public static void main(String[] args) { 
     Calendar cal = new GregorianCalendar(); 
     cal.set(2012, 2, 1); 
     cal.set(Calendar.DAY_OF_WEEK, 1); 
     int dayOfMonth = 1; 
     Object[][] calendarTable = new Object[15][15]; 
     calendarTable[0] = new String[]{"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"}; 
     for (int i = 0; i < 14; i++) { 
      for (int j = 0; j < 14; j++) { 
       //calendarTable[i][j] = dayOfMonth++; 
       if(i%2 == 0){ 
        String str = String.valueOf(cal.get(Calendar.DAY_OF_MONTH)); 
        calendarTable[i][j] = str; 
        cal.add(Calendar.DAY_OF_YEAR, 1); 
       }else{ 
        calendarTable[i][j] = dayOfMonth; 
       } 
       calendarTable[i * 2 + 1][j] = "TEST"; 
      } 
     } 
     for (int i = 0; i < 14; i++) { 
      for (int j = 0; j < 14; j++) { 
       System.out.print(calendarTable[i][j]); 
      } 
      System.out.println(""); 
     } 
    } 
+2

你有沒有檢查日曆表的長度[0]?因爲它從來沒有> 7 – VirtualTroll 2012-03-02 17:24:14

回答

3

您已將其初始化爲15*15,但隨即將初始條目替換爲七個項目的數組。當你進入迭代時,元素零處的數組只有七個項目,而不是十五個。如果您想保留15*15,請將日期的名稱複製到15個項目的數組中。

System.arrayCopy(
    new String[]{"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"} 
, 0 
, calendarTable[0] 
, 0 
, 7); 

此外,如果你想索引去陣列的全長,使用i != 15i < 15,或者i <= 14

1

因爲CalendarTable只有6個索引,並且它在高於該值時死亡。

if (i % 2 == 0) 
     { 
      String str = String.valueOf(cal.get(Calendar.DAY_OF_MONTH)); 
      System.out.println("current value of j: " + j); 
      calendarTable[i][j] = str; 
      cal.add(Calendar.DAY_OF_YEAR, 1); 
     } 

current value of j: 0 
current value of j: 1 
current value of j: 2 
current value of j: 3 
current value of j: 4 
current value of j: 5 
current value of j: 6 
current value of j: 7 //out of bounds 
2

因爲你運行你的循環,直到index < 14

但是你必須在第二個維度只有7天。

FIX:如果更改147那麼這個異常會被固定,但是你將不得不仍然確保您所需的輸出來不來不是所有出現。

1

你的問題是在這裏

calendarTable[i * 2 + 1][j] 

如果i是等於8然後8 * 2 + 1 = 17給你例外calendarTable的

1

數組大小[0] = 7個元素({」星期一「,」星期二「,」星期三「,」星期四「,」星期五「,」星期六「}) 是否要分配一個值來寫入多達15個項目

1

這是因爲該行:

calendarTable[0] = new String[]{"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"}; 

calendarTable是一個數組數組。每行不一定需要具有與其上面相同數量的條目。因此,當你真的做到calendarTable[0] = new String[]時,你告訴Java將calendarTable [0]中的數組替換爲只有7個條目的新數組,這就是爲什麼它會越過邊界。

從理論上講,沒有什麼是從也這樣做,阻止你:

calendarTable[1] = new String[]{"One Entry"}; 

這是合法的。 calendarTable[0].length是7,並且calendarTable[1].length是1。

我不知道你想在這個程序來實現的,但您可能需要做這樣的事情:

calendarTable[0][0] = "SUNDAY"; 
calendarTable[0][1] = "MONDAY"; 
calendarTable[0][2] = "TUESDAY"; 
calendarTable[0][3] = "WEDNESDAY"; 
calendarTable[0][4] = "THURSDAY"; 
calendarTable[0][5] = "FRIDAY"; 
calendarTable[0][6] = "SATURDAY"; 

或者是這樣的:

calendarTable[0] = new String[]{"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "", "", "", "", "", "", "", "", ""};