2012-03-02 51 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", "", "", "", "", "", "", "", "", ""};