【问题标题】:Android: Unbelievable StringIndexOutOfBoundsExceptionAndroid:难以置信的 StringIndexOutOfBoundsException
【发布时间】:2012-05-02 13:47:09
【问题描述】:

我向网络服务器上的 php 脚本发送了一个获取请求,该脚本返回 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);
}

【问题讨论】:

  • indexOf 如果没有找到,则返回 -1。 -1 不是有效的索引。
  • 对于你的第一个循环,你肯定只传递至少包含一个_ 的字符串,这不是最后一个字符吗?不过,无法解释第二点:-/
  • 在尝试提取子字符串之前,您确实应该将 indexOf 的结果与 1 和 line-1 的长度进行比较。
  • 您确定字符串中包含“_”字符吗?否则 'indexOf()' 将返回 -1
  • 是的,我很肯定,当我使用 Log.v 显示该行时,会显示中间带有“_”的整个字符串

标签: php android string exception


【解决方案1】:

indexOf 很可能返回 -1 并且 line.substring(0, -1); 抛出 StringIndexOutOfBoundsException

编辑
会不会是您在 1_485963 行之后读取了一个不可见的字符/行?

假设输入是这样的:

1_485963\n\n

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

【讨论】:

  • 好吧,但是当我正在寻找的索引的字符位于字符串中时,它如何返回-1?这也不能解释为什么简单的 charAt 会抛出异常,当我只是在字符串中间询问一个 char 时
  • 请贴出完整的相关代码。你所经历的不应该发生。一定是其他地方出了问题。
  • 我也尝试使用 if(line.length()
【解决方案2】:

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

我很确定 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 打印 char 之间所做的事情。

最后,有时您可能会从缓冲区输入流中获得垃圾字符。因为它是从 n/w 传过来的。也检查一下。

【讨论】:

  • 这解决了它,但我现在没有从中得到任何东西,因为所有数据都在 if 语句中被丢弃,因为它只是看不到字符串中的 '_' 而我真的没有知道为什么,因为它就在那里。但是我通过在单独的行中发送数据来解决它,所以我不必解析它们。为什么这对我有用一次又一次,我不知道,就像我说的,我在其他地方使用相同的方法,一切正常
【解决方案3】:

也许我变老变盲了,但这是怎么回事

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

生产

1_485963

确实

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

是你需要的。 抱歉,如果那不是有效的 PHP 作为其语法 一直拒绝停留在我的脑海里。

【讨论】:

  • 是的,你是对的,我粘贴了新版本的脚本,我转到另一行而不是在该行中引入“_”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2018-08-05
  • 2013-10-14
相关资源
最近更新 更多