2016-05-30 75 views
0

我想从txt文件中读取用户id及其链接类型。数据以下列格式给出。如何解决java.lang.ArrayIndexOutOfBoundsException错误

SRC:aa 
TGT:bb 
VOT:1 

SRC:cc 
TGT:bb 
VOT:-1 

其中 'SRC' 和用户ID的 'TGT' 指标。在数据中,一些用户ID是空白的,即用户不同意透露自己的身份如下:

SRC: 
TGT:cc 
VOT:-1 

SRC:ff 
TGT:bb 
VOT:1 

在这种情况下,我想给他们一个特殊的ID,“无名氏”。所以,我写了下面的代码:

//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

你可以标记出现此错误的行吗?你可以[编辑]你的帖子。 – Arc676

+0

您是否检查过索引'[0]'数据是否存在? –

+0

'line1Parts'只有一个单元格,你可以通过在String(第二个参数,整数)后指定这个值来强制split方法返回2个单元格 – AxelH

回答

2

如果一行仅包含SRC:,line1parts数组将只有一个项目,因此line1parts[1]会引发ArrayIndexOutOfBoundsException。

通过if (line1parts.length < 2)

+1

我忘了这个愚蠢的逻辑与拆分...谢谢。 – AxelH

0

更换if (line1parts[1].isEmpty())已StephaneM让我记住,拆分法在分离期间修剪空单元格。这删除了最后的每个空单元格。这意味着空细胞如果没有SRC值你的情况

为了防止这种情况,你可以拨打

java.lang.String.split(字符串,整数)

该整数至少指定所需数组的长度。

line1parts = dataline.split(":", 2); 

您一定会收到长度为2或更长的数组。所以这仍然可以删除一些单元格,但是具有长度限制。

一个很好的想法是要知道,如果你发送-1,分割将返回EVERY单元格。没有修剪完成。

0

您正在尝试获取不存在的索引。

split()有助于分割您提供的正则表达式的值。

您正在分割字符串 1.“TGT:CC”在这种情况下分割从方法分割字符串值“:”和它返回大小2即[TGT,CC](它具有0和1的阵列指数)。

2.当你分割字符串“SRC:”在这种情况下拆分方法创建一个大小为1的数组,即[SRC](它只有0索引),因为在这个字符串后面的“:”什么也没有,所以它不会为空值创建额外的索引。

当调用 “line1parts [1] .isEmpty()”,它抛出ArrayIndexOutOfBoundsException异常,因为它不具备索引1

这里有之前调用“line1parts检查 “line1parts.length”[1] 。是空的()”。

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( “:” 2 );