2017-05-24 110 views
-2

我知道有几个关于这个特定错误的帖子,但是这些帖子的答案都没有解决我的问题。基本上我正在读取一个txt文件到列表列表中。它编译没有错误,但是当我运行它时,我得到“ArrayIndexOutOfBoundsException:2”。显然这个问题在第359行是“double tempArea = Double.parseDouble(tokenize [2]);”。我无法看到该行的任何错误,所以我也检查了额外的大括号或分号,但没有找到。我在下面列出了我的代码。任何人都可以看到错误的原因可能是什么?数组索引越界

ArrayList<String>listS = new ArrayList<>(); 


    try 
    { 
     BufferedReader bR = new BufferedReader (new FileReader("EssentialsSaleFile.txt")); 
     String fileRead = bR.readLine(); 
     while(fileRead != null) 
     { 
       String[] tokenize = fileRead.split(","); 
       String tempType = tokenize[0]; 
       String tempAddress = tokenize[1]; 
       double tempArea = Double.parseDouble(tokenize[2]); 
       int tempNumOfBedrooms = Integer.parseInt(tokenize[3]); 
       int tempNumOfToilets = Integer.parseInt(tokenize[4]); 
       int tempNumOfGarages = Integer.parseInt(tokenize[5]); 
       String tempSellerName = tokenize[6]; 
       String tempSellerPhone = tokenize[7]; 
       String tempSaleOfferDate = tokenize[8]; 
       String tempSaleOfferEndDate = tokenize[9]; 
       double tempAskingAmount = Double.parseDouble(tokenize[10]); 
       String tempAssignedEmployee = tokenize[11]; 
       double tempSalesCommissionPerc = Double.parseDouble(tokenize[12]); 

       String tempObj = new String(); 

       listS.add(tempObj); 
       fileRead = bR.readLine(); 


     } 



       bR.close(); 

    } 





     catch(FileNotFoundException ex) 
     { 
       JOptionPane.showMessageDialog(null,"File not here."); 
     } 
     catch (IOException e) 
     { 
     } 
+0

嗯,你的文本文件中只有两个元素的行?提示:尝试在分割之前记录你分割的行...... –

+0

*显然*'tokenize'只包含2个元素。这就是错误信息告诉你的,这是你必须研究的,在行前设置一个断点并检查'tokenize'和'fileRead'。 – luk2302

回答

1

问题不在于代码本身。 tokensize数组包含与您行中逗号分隔字符串一样多的元素。

由于访问第三个元素(tokenize[2])时出现ArrayIndexOutOfBoundsException,因此文件中只有一个逗号。

例如: 该行foo,bar为您提供了只有两个元素的数组["foo","bar"]。访问tokenize[2]将导致ArrayIndexOutOfBoundsException

0

答案很简单。文件中有一行只包含一个逗号。用逗号分隔这一行返回一个只有两个元素的数组,这使得访问tokenize [2]越界。

首先,你应该检查被检查的行包含什么。 之后,如果标记大小的长度为13,则在分割后添加一个检查,如果不是,则跳过该行或其他适当的操作,如显示消息或记录行。