Почему эта программа дает мне исключение индекса массива out of bounds?


static char characters[] = { 'a', 'b', ' ', 'c', ' ', 'e', 'f', ' ' };

public static void main(String args[]) {

    for (int i = 0; i < characters.length; i++) {
        int j = i + 1;

        if (characters[i] == ' ') {
            while (j < characters.length && characters[j] == ' ' || characters[j] == 'u0000') {
                j++;  // increment j till a non-space char is found
            }
        }
    }

    for (char character : characters) {
        System.out.print(character + " ");
    }
}

Eclipse показывает следующую ошибку: Исключение в потоке" main " java.яз..ArrayIndexOutOfBoundsException: 8 в loopchecker.основной(loopchecker.java: 13)

Строка 13 является while loop. Но я уже проверяю, если j's значение меньше длины или нет.

6 2

6 ответов:

Его из-за оператора or.

Следующее условие читается так

(j < characters.length && characters[j] == ' ') || characters[j] == '\u0000'

Таким образом, вы всегда выполняете условие or из-за приоритета оператора and над оператором or, что приводит к тому, что ArrayOutOfBoundException. может потребоваться включить фигурные скобки в условие while.

while (j < characters.length && (characters[j] == ' ' || characters[j] == '\u0000'))

Вам нужно добавить некоторые скобки к вашему заявлению while:

while (j<characters.length && (characters[j] == ' ' || characters[j] == '\u0000'))

В противном случае порядок операций Java видит его как

while ((j<characters.length && characters[j] == ' ') || characters[j] == '\u0000')

, что означает, что characters[j] все равно будет оценено, если первая часть ложна.

Учитывая, что в комментарии вы хотите сказать //increment j till a non-space char is found, я бы сказал, что вам следует избавиться от:

while (j<characters.length && characters[j] == ' ' || characters[j] == '\u0000')

, который вызывает вашу ошибку из-за проблемы с ||, оцениваемой после && и заменяющей ее:

while (j<characters.length && Character.isWhitespace(characters[j]))

Это решает вашу проблему вместе с решением проблемы пробелов гораздо удобнее.

Часть characters[j] == '\u0000' не имеет проверки, чтобы гарантировать, что j меньше длины. Поставьте что-нибудь вроде j < characters.length && (.. || ..)

Это происходит из-за оператора OR . Ниже приводится полное решение .

package com.java;

public class ArraySample 
{
    static char characters[]={'a','b',' ','c',' ','e','f',' '};
    public static void main (String args[])
    {
        for (int i = 0; i < characters.length; i++) {
            int j = i + 1;
            if (characters[i] == ' ') {
                while (j < characters.length && (characters[j] == ' ' || characters[j] == '\u0000')) {

                    j++;  //increment j till a non-space char is found

                }

            }
        }
        for(int i = 0; i< characters.length; i++)
        {
            System.out.print(characters[i]+" ");
        }
        }

}
static char characters[] = { 'a', 'b', ' ', 'c', ' ', 'e', 'f', 's' };

public static void main(String args[]) {

    for (int i = 0; i < characters.length; i++) {
        int j = i - 1 ; // The problem was here J was surpassing the characters length

        if (characters[i] == ' ') {
            while (j < characters.length && characters[j] == ' ' || characters[j] == '\u0000') {
                j++;  // increment j till a non-space char is found
            }
        }
    }

    for (char character : characters) {
        System.out.print(character + " ");
    }
}