Java字符串出界愚蠢

时间:2015-11-27 02:33:53

标签: java arrays string intellij-idea indexoutofboundsexception

我正在从文件中读取并在文件中的一行上读取: " {A,B,C,d}"我在该行上运行了一个split函数,它返回一个10的字符串数组(不知道为什么是10而不是9)元素。每个元素都是一个字符长。然后我对该数组进行了一个foreach循环,并在该循环的主体内,我正在检查是否" char"是一个letterOrDigit,如果它是..做其他事情。但是在该循环的第一次迭代中,我得到一个StringIndexOutOfBounds异常,并且在我的生命中我不知道为什么。使用intelliJ时我没遇到这个问题。这是在日食中运行,它让我疯了。请帮忙。

# config/environments/production.rb

...

config.log_tags = [ :uuid,:remote_ip ]

...

# log/production.log

[4d23e817-eca8-4db1-ba5b-7456d3af7f65] [127.0.0.1] Started GET "/resources/id" for 127.0.0.1 at 2015-11-26 21:09:11 +0900

This is a screenshot of what the String array looks like after the split

This is what the line looks like after the file has been read.

3 个答案:

答案 0 :(得分:4)

数组中的第一个字符串是一个空字符串:“”。它的长度为0,因此str.charAt(0)超出范围。

答案 1 :(得分:4)

我认为你不需要使用spilled函数,你想通过char读取整个char char,就像数组访问一样。 字符串拆分函数的空值产生额外的元素,因为溢出函数对于这种情况没有特殊的案例处理,尽管它在拆分字符串的长度为1时正确处理了案例

您可以在下面重写代码

for (int line = 1; line < file.size(); line++) // start at line 1 cause the line with the alphabet is useless.
    {
        if (line == 1) // Line 1 is always the states... so create the states.
        {
            String lineValue = file.get(line);
            int len = lineValue.length();
            for (int index = 0; index < len; index++) {
                if (Character.isLetterOrDigit(lineValue.charAt(index))) {
                    //dfa.addState(new State(str.charAt(0)));
                }
            }
        }
    }

答案 2 :(得分:0)

从截图中,索引0长度的数组元素为0,即它是一个空字符串,但在迭代期间,您尝试访问空字符串的第一个字符,因此它会抛出IndexOutOfBoundException

为了避免这种情况,请先检查lengthisEmpty,然后再访问char