在类的某个地方我已经声明了一个时间字符串变量:
String name;
我将用于存储文字数据。该文本包含许多具有这两种格式的字段:
Type: text/html
name=foo
对于这种情况,我对类型字段 name=foo
所以,我先前使用split
String lines[] = text.split("\n");
而且,我将再次使用split
来识别所提及类型的字段。在下面的代码中,while循环在检测到name=foo
字段的位置停止,并在控制台中打印该字段的值。
int i = 0; // Counter for the while cycle
while (!(lines[i].split("=")[0].equals("name"))) {
i++;
if (lines[i].split("=")[0].equals("name")) // If the field is name...
System.out.println(lines[i].split("=")[1]); // Prints the value of the field
name = lines[i].split("=")[1]; // <-- My problem is here
}
当我想将字段的值复制到早期提到的String变量时,我的问题开始了,给我一个 java.lang.ArrayIndexOutOfBoundsException 。
我需要String稍后再做一些事情。是否安全地将该字段的值复制到String变量?
答案 0 :(得分:1)
为你的问题添加paranthesis可以避免两个问题:
为了取悦编译器,您可能还希望将名称初始化为null
。
int i = 0; // Counter for the while cycle
while (!(lines[i].split("=")[0].equals("name"))) {
i++;
if (lines[i].split("=")[0].equals("name")){ // If the field is name...
System.out.println(lines[i].split("=")[1]); // Prints the value of the field
name = lines[i].split("=")[1]; // <-- My problem is here
}
}
答案 1 :(得分:1)
在您的代码中:
String name;
name = lines[i].split("=")[1];
这里的名字每次都会覆盖。
我认为你正在寻找这样的东西:
String names[];
String lines[] = text.split("\n");
names[] = new String[lines.length];
在你内心循环时,它就像:
names[i] = lines[i].split("=")[1];
答案 2 :(得分:1)
您的代码有很多注意事项:
{}
- 语句之后错过if
,因此每次运行while
时都会更新名称 - 循环[1]
产生了多少元素split("=")
split("=")
次4次。通过引入临时变量来节省CPU时间!while
- 循环替换为for
循环,该循环也会在第一行中找到name=value
而不会#34;抛出&#34;如果name=value
不在任何行内(您不检查i
是否小于lines.length
)我把你的评论留在了我的答案中;随意删除它们。
变体a(使用索引):
for (int i = 0; i < lines.length; i++) {
// Only split once and keep X=Y together in name=X=Y by specifying , 2
final String[] split = lines[i].split("=", 2);
if (split.length == 2 && split[0].equals("name")){ // If the field is name...
System.out.println(split[1]); // Prints the value of the field
name = split[1]; // <-- My problem is here
break; // no need to look any further
}
}
变体b(使用&#34; for-each&#34;):
for (String line : lines) {
// Only split once and keep X=Y together in name=X=Y by specifying , 2
final String[] split = line.split("=", 2);
if (split.length == 2 && split[0].equals("name")) { // If the field is name...
System.out.println(split[1]); // Prints the value of the field
name = split[1]; // <-- My problem is here
break; // no need to look any further
}
}
答案 3 :(得分:0)
我想你的问题是当你到达最后一行或不包含“=”符号的行。你正在检查
!(lines[i].split("=")[0].equals("name"))
然后你加1给我,所以这个条件现在可能是假的
if (lines[i].split("=")[0].equals("name"))
你将在这里得到java.lang.ArrayIndexOutOfBoundsException
name = lines[i].split("=")[1];
如果该行不包含“=”。
尝试
if (lines[i].split("=")[0].equals("name")) { // If the field is name...
System.out.println(lines[i].split("=")[1]); // Prints the value of the field
name = lines[i].split("=")[1];
}