我正在尝试从txt文件中读取用户ID及其链接类型。数据以下列格式给出。
SRC:aa
TGT:bb
VOT:1
SRC:cc
TGT:bb
VOT:-1
其中' SRC'和' TGT'用户ID的指标。在数据中,一些用户id是空白的,即用户不同意透露他们的身份如下:
SRC:
TGT:cc
VOT:-1
SRC:ff
TGT:bb
VOT:1
在这种情况下,我想给他们一个特殊的身份证,"匿名"。所以,我写了下面的代码:
//Reading source
dataline = s.nextLine();
String[] line1parts = new String[2];
.
.
//split the line at ":"
line1parts = dataline.split(":");
//if the line has source
if (line1parts[0].trim().equals("SRC")){
//if the soruce name is empty
if (line1parts[1].isEmpty()) {
src = "anonymous";
System.out.print("src: " + src);
}
//if the source already integer id
else {
src = line1parts[1].trim();
System.out.print("src: " + src);
}
}
程序显示java.lang.ArrayIndexOutOfBoundsException
错误。我还尝试了if (line1parts[1].equals("")
和if (line1parts[1].equals(null)
。可能对于SRC: (when empty)
的情况,字符串数组没有创建任何对象(对不起,如果我错了。我是java中的新手)。如何在用户ID为空时分配用户ID?提前谢谢。
答案 0 :(得分:2)
如果一行只包含SRC:
,则line1parts数组只有一个项,因此line1parts[1]
会引发一个ArrayIndexOutOfBoundsException。
将if (line1parts[1].isEmpty())
替换为if (line1parts.length < 2 )
答案 1 :(得分:0)
StephaneM让我记住,拆分方法在拆分过程中修剪空单元格。这删除了最后的每个空单元格。如果您的案例
中没有 SRC值,则表示空单元格为防止这种情况,您可以致电
java.lang.String.split(String,int)
此整数至少指定所需数组的长度。
line1parts = dataline.split(":", 2);
您一定会收到长度为2或更长的数组。所以这仍然可以删除一些单元格,但是有一个长度约束。
一个好的想法是,如果你发送-1,拆分将返回每个单元格。没有修剪。
答案 2 :(得分:0)
您正在尝试获取不存在的索引。
split()有助于从您提供的正则表达式中划分值。
你是分裂的字符串 1&#34; TGT:CC&#34;在这种情况下,拆分方法拆分字符串值来自&#34;:&#34;它返回一个大小为2的数组,即[TGT,cc](它有0和1索引)。
2.当你分割字符串&#34; SRC:&#34;在这种情况下,split方法创建一个大小为1的数组,即[SRC](它只有0个索引),因为在&#34;之后的这个字符串中:&#34;什么都没有,所以它不会为空值创建额外的索引。
当您致电&#34; line1parts [1] .isEmpty()&#34;它抛出ArrayIndexOutOfBoundsException,因为它没有索引1。
在这里你必须检查&#34; line1parts.length&#34;在致电&#34; line1parts [1] .isEmpty()&#34;。
之前 line1parts = dataline.split(":");
// if the line has source
if (line1parts[0].trim().equals("SRC")) {
if (line1parts.length > 1) {
// if the soruce name is empty
if (line1parts[1].isEmpty()) {
src = "anonymous";
System.out.print("src: " + src);
}
// if the source already integer id
else {
src = line1parts[1].trim();
System.out.print("src: " + src);
}
}
}
或者-----------------
你必须做::
line1parts = dataline.split(&#34;:&#34;,2);