2015-08-20 105 views
-1

我想读一些格式线:爪哇 - ArrayIndexOutOfBoundsException异常

名称|简;年龄| 64;状态|结婚

名称|安妮;年龄| 32;职业|银行;工资| 32000;状态|单一

每行包含不等数量的键值对。

我使用的对象矩阵分开并且将这些值存储为每下面的代码片断:

BufferedReader inputStream = null; 
inputStream = new BufferedReader(new FileReader(arg[0])); 
String Line=null; 

while ((Line = inputStream.readLine()) != null) { 

    //STORE INTO KVP 

    int i = 0; 
    Object kvp[][]= new Object[40][2]; 

    for (String element : Line.split(";")) { 
     kvp[i][0] = (element.split("\\|")[0]); 
     kvp[i][1] = (element.split("\\|")[1]); 
     i++; 
    } 

    col = i; 
    System.out.println("Object Matrix for the line:"); 
    for (i = 0; i < col; i++) { 
     System.out.println(kvp[i][0] + " : " + kvp[i][1]); 
    } 

} //end of while 

在总共70行中,仅有39被分离并作为对象的矩阵存储和该异常显示为:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    >at first.main(first.java:32) 

某些值,例如键,作为地址,真的很长。

+0

'first.java:32'是什么行?你还没有发布整个文件的代码,所以我们不能告诉。 – nkorth

+0

这里有几个问题: 1.您的“kvp”数组可能会导致OOB异常,因为您只允许输入40个条目,但在分割“Line”时不检查for循环。 2.您不检查格式不正确的行(没有|或没有任何其他行) 3.您的“kvp”数组在任何时候都会在while循环结束时丢失 – Fallso

+0

之后会在kvp内完成更多的处理。至于格式不正确的行,输入来自另一个来源,它应该是没有错误的。但是,由于错误的来源是错误的输入,所以在处理之前必须对其进行检查。 –

回答

1

尝试执行下面的程序,这将解决您的期望。 第二行是空的,所以你遇到问题。我已经添加了if条件。

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class ReadFile { 
    public static void main(String[] args) throws IOException { 

    String sCurrentLine; 

    BufferedReader br = new BufferedReader(new FileReader(args[0])); 

    while ((sCurrentLine = br.readLine()) != null) { 

     int i = 0; 
     Object kvp[][] = new Object[500][2]; 
     String[] sCurrArr = sCurrentLine.split(";"); 
     if (sCurrArr.length != 1) { 
     for (String element : sCurrArr) { 
      kvp[i][0] = (element.split("\\|")[0]); 
      kvp[i][1] = (element.split("\\|")[1]); 
      i++; 

     } 
     } 

     int col = i; 

     for (int j = 0; j < col; j++) { 
     System.out.println(kvp[j][0] + " : " + kvp[j][1]); 
     } 

    } 
    } 
} 

期望输出:在try-catch代码

name : jane 
age : 64 
status : married 
name : anne 
age : 32 
profession : banking 
salary : 32000 
status : single 
+0

除了缺失的行,还有缺失值的问题。例如:address | abcd; contactNumber |;所以,我用if((element.split(“\\ |”)[1])!= NULL) \t \t \t \t \t \t { \t \t \t \t \t \t \t KVP [I] [1] =(element.split( “\\ |”)[1]); \t \t \t \t \t \t}但它跳过空值后的键值对。 –

1

可能你有分隔符内部的值。
例如;

address|"something;something" 

因此(element.split("\\|")[1])给出错误。

+0

不,在我正在使用的值集中没有这样的东西。感谢您的评论。 –

0

裹解析器:

try { 
    for (String element : line.split(";")) { 
     kvp[i][0] = (element.split("\\|")[0]); 
     kvp[i][1] = (element.split("\\|")[1]); 
     i++; 
    } 
} catch (ArrayIndexOutOfBoundsException e) { 
    System.err.println(element); 
    System.err.println(line); 
} 

发现哪些元素和行导致错误。

+0

这在查明错误的地方很有用。 –