Java数组 - 初始化数组上的超出范围异常

时间:2012-03-02 17:20:43

标签: java arrays

我在“calendarTable [i] [j] = str;”上遇到了一个越​​界异常下面的一行。我发现这很有趣,因为我将它初始化为15,我只迭代到14.我已经尝试初始化为20000,无论我做了多大的数组,它仍然会得到索引超出界限错误。

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("");
        }
    }

6 个答案:

答案 0 :(得分:3)

您已将其初始化为15*15,但随后立即用七项数组替换了初始条目。当你进入迭代时,元素零处的数组只有七个项目,而不是十五个。如果您想保留它15*15,请将日期的名称复制到15个项目的数组中。

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

此外,如果您希望索引遍历数组的全长,请使用i != 15i < 15i <= 14

答案 1 :(得分:2)

因为您在index < 14

之前运行循环

但是你在第二维只有7天。

FIX:如果您将所有14更改为7,则此异常将被修复,但您仍将确定所需的输出是否即将到来

答案 2 :(得分: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

答案 3 :(得分:1)

你的问题在这里

calendarTable[i * 2 + 1][j]

如果i等于8,那么8 * 2 + 1 = 17会给你异常

答案 4 :(得分:1)

calendarTable [0]的数组大小= 7个元素({“SUNDAY”,“星期一”,“星期二”,“星期三”,“星期四”,“星期五”,“星期六”}) 是否要分配最多可写入15个项目的值

答案 5 :(得分: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", "", "", "", "", "", "", "", "", ""};