Как мне преодолеть java.lang.ArrayIndexOutOfBoundsException: 2 в этом коде? - PullRequest
0 голосов
/ 24 марта 2012

Когда я тестировал этот код, он дал мне 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 ]

1 голос
/ 24 марта 2012

Последний цикл для переполнится, когда i = size-1

В вашем вопросе вы хотите получить сумму между двумя соседними числами. Ваша логика в последнем цикле для говорит, что вы вычисляете сумму, добавляя число 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]];
        }
    }

С этой фиксированной логикой самый большой элемент в цикле для равен size-2 , и когда вы добавляете к нему 1 (для следующего соседнего числа), он выберет item (size-2) + 1 , который является последним элементом в массиве, а не переполняет массив.

1 голос
/ 24 марта 2012

Полагаю, проблема в вашем последнем цикле for.Поскольку order может содержать значения в диапазоне от 0 до size, num[order[i]] всегда допустимо, но в случае, когда order[i]==size, num[order[i+1]] выходит за пределы.

...