如何在此代码中克服java.lang.ArrayIndexOutOfBoundsException:2?

时间:2012-03-24 02:42:31

标签: java arrays for-loop while-loop boolean

当我测试这段代码时,它给了我java.lang.ArrayIndexOutOfBoundsException:2 代码还没有完成,但这正是我想要做的: 一个程序,询问用户两个数字。打印较小的所有数字 以随机顺序编号为较大的数字(包括)。使用此订单,找到 彼此相邻的2个数字的最大总和。 有些人可以指出我需要修复什么以及如何修复它?感谢。

 boolean isNum = false;
    int in1 = 0;
    int in2 = 0;
    int size = 0;
    int largestsum = 0;
    while (!isNum) {
        try {
            System.out.print("Enter a number: ");
            in1 = Integer.parseInt(in.readLine());
            boolean isSame = false;
            while (!isSame) {
                System.out.print("Enter a number: ");
                try {
                    in2 = Integer.parseInt(in.readLine());
                    if (in1 != in2) {
                        isSame = true;
                    } else {
                        System.out.println("Same number.");
                    }
                } catch (NumberFormatException nfe) {
                    System.out.println("Not a number.");
                }
            }
            isNum = true;
        } catch (NumberFormatException nfe) { //catches error
            System.out.println("Not a number."); //informs user of the error
        }
    }
    if (in1 > in2) {
        size = in1 - in2 + 1;
        int[] num = new int[size];
        for (int i = 0; i < size; i++) {
            num[i] = in2 + i;
        }
        int[] order = new int[size];
        boolean[] used = new boolean[size];
        for (int i = 0; i < size; i++) {
            int r = (int) ((size) * (Math.random()));
            while (used[r]) {
                r = (int) ((size) * Math.random());
            }
            order[i] = r; //fill array
            used[r] = true; //r is now used
        }
        for (int i = 0; i < size; i++) {
            if (num[order[i]] + num[order[i + 1]] > largestsum) {
                largestsum = num[order[i]] + num[order[i + 1]];
            }
        }

2 个答案:

答案 0 :(得分:1)

我的猜测是你的最后一个循环问题。由于order可以包含从0size的值,num[order[i]]始终有效,但在order[i]==sizenum[order[i+1]]出来的情况下边界。

答案 1 :(得分:1)

当i = size-1

时,最后一个 for 循环将溢出

在您的问题中,您希望获得两个相邻数字之间的总和。您在上一个 for 循环中的逻辑表示您通过将数字 i 添加到 i + 1 来计算总和。数组中的最后一项位于 size-1 位置,因此当您尝试将其添加到下一个相邻的数字时,(size-1)+1 会溢出阵列。

要解决此问题,您的最后一个for循环应该只会继续,直到 i&lt; size-1 ,就像这样......

    for (int i = 0; i < size-1; i++) {
        if (num[order[i]] + num[order[i + 1]] > largestsum) {
            largestsum = num[order[i]] + num[order[i + 1]];
        }
    }

使用此固定逻辑, for 循环中的最大项目是 size-2 ,当您向其添加1(对于下一个相邻的数字)时,它将选择(size-2)+1 项,这是数组中的最后一项,而不是溢出数组。