为什么这个程序给我一个数组索引超出范围的例外?

时间:2016-02-23 06:32:21

标签: java while-loop indexoutofboundsexception

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.lang.ArrayIndexOutOfBoundsException:8     在loopchecker.main(loopchecker.java:13)

第13行是while loop。但我已经在检查j's值是否小于长度。

6 个答案:

答案 0 :(得分:6)

这是因为or运算符。

以下条件如下所示

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

所以你总是执行or或条件,因为and运算符优先于or运算符导致ArrayOutOfBoundException.您可能希望在while条件中包含大括号。< / p>

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

答案 1 :(得分:3)

您需要在while语句中添加一些括号:

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

否则,Java的order of operations将其视为

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

这意味着如果第一部分为假,仍将评估characters[j]

答案 2 :(得分:2)

鉴于评论中你想说//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]))

这解决了您的问题以及更方便地处理空白问题。

答案 3 :(得分:1)

characters[j] == '\u0000'部分没有检查以确保j小于长度。加上像j < characters.length && (.. || ..)

这样的东西

答案 4 :(得分:0)

这是因为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]+" ");
        }
        }

}

答案 5 :(得分:0)

{{1}}