Почему эта программа дает мне исключение индекса массива 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 ответов:
Его из-за оператора
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 + " "); } }