【发布时间】:2019-07-07 08:26:06
【问题描述】:
我正在为我的公司在Java(Android 平台)上开发一个应用程序,遇到了一个我无法解决的问题。
事情是这样的:通过阅读text file,我用以下内容填充content 字符串:
String content = "";
content = buffReader.readLine(); buffReader.close();
这项工作非常好。 content 字符串正确填充了文件内容。这个字符串的每一行数据都用&字符分隔,所以我这样填充lines数组:
String[] lines;
lines = content.split("&");
同样,这里没有错误。然后,每个字段用: 字符分隔,我再次尝试以相同的方式填充下一个字符串:
String line; String[] data;
String data1 = ""; String data2 = ""; String data3 = ""; String data4 = "";
for (int i = 0; i < lines.length; i++){
line = lines[i];
data = line.split(":");
data1 = data[0];
data2 = data[1];
data3 = data[2];
data4 = data[3];
}
如果文本是A:B:C:D,则代码可以正常工作。即使文本是 A:B::D 也没关系(并且 data3 变成 "" 就像我想要的那样)。但是,如果文本是A:::,则代码不起作用并关闭应用程序。在这种情况下,我可以获得data1 = data[0],但对于其他每个步骤,都会出现错误。
有谁知道怎么回事?!我错过了什么吗?非常感谢。
编辑:
如果有人能解释为什么代码可以与 A:B::D 文本一起正常工作...我的意思是!它确实有一个空文件,对吧?
【问题讨论】:
-
“不起作用” .. 你能说得更具体点吗?
-
@Stultuske,它关闭了应用程序。
-
@Pspl 更具体的错误是什么。
-
我的猜测是你得到 IndexOutOfBoundsException 因为
split默认删除空的尾随字符串,所以对于A:::,结果数组将只包含{"A"}而不是{"A", "", "", ""}(所以没有索引1, 2,3)。如果是这种情况,请按照Java String split removed empty values中所述使用split(":", -1) -
因为它会删除尾随空字符串,而不是非空元素中间的那些。例如,如果您有
A:B::,那么首先它将被拆分为数组{"A", "", "B", "", ""},但是因为通常我们不需要最后一个空值(例如当我们根据行分隔符拆分文本文件时,它有一些额外的空行最后)Java 作者决定从末尾自动删除空字符串(因为 Java 8 有时甚至从前面删除 - stackoverflow.com/q/22718744)。所以它创建并返回另一个没有那个“副产品”的更小的数组。
标签: java android arrays string split