显示匹配的行时ArrayIndexOutOfBoundException

时间:2013-02-09 06:43:26

标签: java

我的Android代码中存在问题。我的目标是读取文本文件的每一行以匹配静态字符串,我还需要显示所有匹配的问题。 我的静态输入字符串是“你的DOB是什么”,还有一个文本(fms.txt)文件,其中包含assets文件夹中的所有问题。然后我编译了这段代码。我输错了。

我的代码

try {
    ins = this.getAssets().open("fms.txt");
    reader = new BufferedReader(new InputStreamReader(ins));
    line = reader.readLine();
    message = "What is your DOB";
    messages = message.split(" ");
    int i = 0, j = 0, inc = 1, oldin = 0;
    while (line != null) {
        lines = line.split("#");
        words = lines[0].split(" ");
        if (words[0].trim().equals(messages[0].trim())) {
            for(i = 1; messages[i].trim() != null; i++) {
                Log.e(TAG, "----------::::"+messages[i].trim());
                oldin = inc;
            }
        }
        line = reader.readLine();
    }
    ins.close();
    Log.e(TAG, "---------FMSG : "+finalmsg);
} catch(IOException e1) {
    e.printStackTrace();
}

enter image description here

2 个答案:

答案 0 :(得分:0)

问题出现在您的for(i=1; messages[i].trim() ...中,因为i有时会大于或等于messages数组的长度。要解决此问题,您应该将代码更改为:

for (i = 1; i < messages.length && messages[i] != null &&
            !messages[i].trim().isEmpty(); i++) {
    //your business logic...
}

解释变化:

  • i < messages.length:这必须是第一条规则。请注意,Java从左到右进行评估。在迭代数组时,必须首先检查索引是否小于数组大小。

  • messages[i] != null:其次,检查数组元素是否与null不同。如果您对messages[i].trim()个实例null NullPointerException,则会获得!messages[i].trim().isEmpty()

  • null:最后,在您知道可以访问该元素并且此元素不是String之后,您可以修剪前导空格并检查messages[i]是否不是空的。

请注意,此错误不是Android应用程序错误,而是Java错误编码。

进一步修订,您无需担心nullfor (i = 1; i < messages.length; i++) { //your business logic... } ,甚至不是空的。你的代码应该只是

{{1}}

顺便说一句,下次请不要发布您的代码图片,而是将其写在您的问题上。如果您不了解如何格式化代码,请不要担心,其他人会编辑问题并给您一个帮助。对堆栈跟踪的建议相同。

答案 1 :(得分:0)

你在这里面对ArrayIndexOutOfBoundsException,因为你的比较中仍有一些空白区域

替换

for(i=1; messages[i] != null, i++)

for(i = 1; i < messages.length && messages[i] != null && !messages[i].trim().isEmpty(); i++)