如何解决java.lang.ArrayIndexOutOfBoundsException错误

时间:2016-05-30 11:28:25

标签: java arrays

我正在尝试从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?提前谢谢。

3 个答案:

答案 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);