Android:令人难以置信的StringIndexOutOfBoundsException

时间:2012-05-02 13:47:10

标签: php android string exception

我向webserver上的php脚本发送一个get请求,返回3行文本。我像这样处理来自服务器的响应:

BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

比我解析这样的行:

line = "";
while ((line = rd.readLine()) != null) {
    String a = line.substring(0, line.indexOf('_'));
    String b = line.substring(line.indexOf('_') + 1);
}

这会不断抛出一个StringIndexOutOfBounds异常,我真的不明白为什么。我已经在我的项目的其他地方使用了类似的方法(使用不同的PHP脚本返回不同的文本行和不同的解析)并且它工作得很好。当我记录返回的行以查看它们是否从服务器正确返回时,它们与PHP脚本发送的行相同。

这是有趣的部分。当我变得非常绝望时,我尝试使用以下方法测量线:

int l = line.length();

然后我的线路返回了11。比,当我只是尝试使用以下方式显示内容时:

line.charAt(5);

它抛出了一个StringIndexOutOfBoundsException:5。我真的不知道这有什么问题。有没有人有想法?谢谢!

修改

这是PHP脚本

$query = mysql_query("SELECT * FROM users");
while($row = mysql_fetch_array($query)) {
    print("{$row['id']}\n{$row['number']}\n");
}

这是我的java代码:

while ((line = rd.readLine()) != null) {
    Log.v("connection - user list", line); //This line logs: 1_485963
    //But this doesent work
    String a = line.substring(0, line.indexOf('_'));
    String b = line.substring(line.indexOf('_') + 1);
}

3 个答案:

答案 0 :(得分:4)

最有可能indexOf返回-1而line.substring(0, -1);会抛出StringIndexOutOfBoundsException

修改
你可能会在1_485963行之后阅读一个看不见的字符/行吗?

假设输入如下:

1_485963\n\n

然后在日志中你只会看到1_485963,但第二次循环运行它会崩溃。

答案 1 :(得分:0)

首先尝试调试。或者试试这个

我很确定line.indexOf('_')在给定的字符串中不可用

1)首先打印字符串的日志并检查'_'字符是否可用。

尝试这样做以避免StringIndexOutOfBoundsException

while ((line = rd.readLine()) != null) {
if (line.indexOf('_') != -1) {
   String a = line.substring(0, line.indexOf('_'));
   String b = line.substring(line.indexOf('_') + 1);
    }else{
   // means that index is not found
   }
 }

最后你告诉了字符串len = 11 当在第5位打印char时抛出错误。

检查你在打印字符串len和在位置5打印字符之间做了什么。

有时候你可能会从缓冲区输入流中获得垃圾字符。 becoz从n / w传递。检查一下。

答案 2 :(得分:0)

也许我变老了,失明了,但这是怎么回事。

    print("{$row['id']}\n{$row['number']}\n");

生产

1_485963

当然

print("{$row['id']}_{$row['number']}\n");

是你需要的。 如果这不是PHP的语法,那就道歉了 一直拒绝坚持我的大脑。