-1

我正在尝试分解一个字符串192.168.1.2:6060;rport;branch=z9hG4bKNskFdtGO4"

我想提取port:ip第一个分号之前的,以及等号之后的分支号。

我试过的代码是

temp = in.next();
System.out.println(temp.contains(";"));
System.out.println(temp.contains("="));
System.out.println("Temp: " + temp + " ");
sipName = temp.substring(0, temp.charAt(';'));
branch = temp.substring(temp.charAt('='));

我添加了 printlns 以显示是否至少在字符串中找到了它们的字符。

当我运行代码时,我在行得到一个 StringIndexOutOfBoundsErrorsipName = temp.substring(0, temp.charAt(';'));

我的控制台输出是:

true
true
Temp: 192.168.1.2:6060;rport;branch=z9hG4bKb8NGxwdoR
Exception in thread "Thread-1" java.lang.StringIndexOutOfBoundsException: String index out of range: 59
...

即使我只是尝试它也会失败System.out.println(temp.charAt(';'));

我不确定为什么会这样。有人能解释一下吗?我难住了。

4

5 回答 5

3

调用temp.indexOf(';')而不是temp.charAt(';'). 同样,调用temp.indexOf('=')而不是temp.charAt('=').

indexOf告诉您给定字符在字符串中的第一次出现位置。 charAt返回字符代码而不是字符串中的位置,因此在哪里使用它没有意义。

(无论如何,当您调用时,charAt您传递的是字符串中的一个位置,而不是字符代码。您几乎可以将其视为与 . 的反面indexOf。)

于 2013-11-28T00:01:40.163 回答
1

String.charAt需要一个整数。你正在传递一个字符。请参阅此处以供参考: http ://docs.oracle.com/javase/6/docs/api/java/lang/String.html#charAt%28int%29

于 2013-11-28T00:03:16.533 回答
1

用 indexOf 替换 chatAt。

这个 charAt 是一个逻辑错误,你实际上想要 indexOf。

好的,其他人更快;)

于 2013-11-28T00:03:18.057 回答
1
String sipName = StringUtils.substringBefore(str, ";");
String branch = StringUtils.substringAfter(str, "=");

StringUtils 文档

于 2013-11-28T00:04:14.670 回答
1

你需要的是

temp.indexOf(";");

在编译时不会出现任何异常,因为它会转换“;” 转换成它的 ASCII 值 59。所以它试图访问这个字符串的第 60 个元素。最后,这给你一个

StringIndexOutOfBoundsException

在运行时。

于 2013-11-28T00:07:25.560 回答