Почему ругается среда, хотя всё равно выводит всё верно

Рейтинг: -5Ответов: 2Опубликовано: 08.08.2023

Задача:

Тебе нужно написать программу, которая: Считывает с консоли целое число N. Если считанное число N больше 0, то программа дальше считывает целые числа, количество которых равно N. Вывести в консоль считанные числа, если N нечетное — в порядке ввода, иначе — в обратном порядке. Каждое число выводить с новой строки. Число N выводить не нужно.

Ошибка:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
Index -1 out of bounds for length 4 
at com.javarush.task.pro.task05.task0505.Solution.main(Solution.java:27)

Код:

public class Solution {

    public static void main(String[] args) {
        //напишите тут ваш код
        Scanner scanner = new Scanner(System.in);
        int inputNumberN = scanner.nextInt();
        int[] arrayNumber = new int[inputNumberN];
        if (inputNumberN > 0){
            for(int i = 0; i < inputNumberN; i++){
                arrayNumber[i] = scanner.nextInt();
            }
        }
        if (inputNumberN % 2 != 0){
            for (int j = 0; j < arrayNumber.length; j++){
                System.out.println(arrayNumber[j]);
            }
        } else {
            for (int i = inputNumberN; i >= 0; i--){
                System.out.println(arrayNumber[i-1]);
            }
        }
    }
}

Ответы

▲ 4

Ошибки нужны, чтобы их читать. Так давайте же прочитаем ошибку:

Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 4
at com.javarush.task.pro.task05.task0505.Solution.main(Solution.java:27)

Тут написано, что произошло исключение на 27 строке. Исключение это называется ArrayIndexOutOfBoundsException. Читаем документацию:

Thrown to indicate that an array has been accessed with an illegal index. The index is either negative or greater than or equal to the size of the array.

Вольный перевод:

Выбрасывается, чтобы указать на то, что производится попытка обращения к несуществующему индексу. Индекс либо отрицателен, либо больше или равен размеру массива.

В ошибке даже указан неверный номер индекса (-1).

Ошибка в этом цикле:

for (int i = inputNumberN; i >= 0; i--){
    System.out.println(arrayNumber[i - 1]);
}

Ведь когда i будет равно 0, то вы пытаетесь выводить на экран индекс под номером
arrayNumber[i - 1], то есть индекс -1, которого не существует. Поэтому и выкидывается ArrayIndexOutOfBoundsException.

Как исправить ошибку, вы, наверное, уже поняли, ибо её причину я вам изложил.

▲ 2

Уважаемый @Зонтик детально рассмотрел причины ошибки выхода за пределы массива в своём ответе, но хотелось бы показать одну "идиому", которую можно использовать при прохождении массива в обратном порядке с циклом for:

public static void printArrReverse(int ... arr) {
    for (int i = arr.length; i-- > 0;) { // i стремится к 0
        System.out.println(arr[i]);
    }
}

То есть, индекс устанавливается равным длине массива и при первой же проверке условия происходит необходимый декремент, так что в теле цикла первое обращение будет по индексу n - 1, и соответственно строгое условие i-- > 0 гарантирует, что не будет выхода за границу массива слева.