【问题标题】:How do I overcome java.lang.ArrayIndexOutOfBoundsException: 2 in this code?如何克服这段代码中的 java.lang.ArrayIndexOutOfBoundsException: 2 ?
【发布时间】:2012-04-08 13:47:04
【问题描述】:

当我测试这段代码时,它给了我 java.lang.ArrayIndexOutOfBoundsException: 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]];
            }
        }

【问题讨论】:

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


    【解决方案1】:

    最后一个for循环会在i=size-1时溢出

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

    要解决此问题,您的最后一个 for 循环应该只持续到 i,就像这样...

        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(对于下一个相邻的数字),它将选择item (size-2)+1,它是数组中的最后一项,而不是溢出数组。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 2019-04-19
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 2023-01-08
        相关资源
        最近更新 更多