2014-03-13 107 views
0

我有以下代碼讀取一行學生,程序應該在每個空白處拆分,然後轉到文本的下一部分,但是我得到了arrayindexoutofBound異常。 文本文件有幾行是這樣的:Java數組索引超出範圍

130002 Bob B2123 35 34 B2132 34 54 B2143 23 34 



public static void main(String[] args) throws FileNotFoundException { 
    File f = new File("C:\\Users\\Softey\\Documents\\scores.txt"); 
    Scanner sc = new Scanner(f); 

    List<MarkProcessing> people = new ArrayList<MarkProcessing>(); 

    while(sc.hasNextLine()){ 
     String line = sc.nextLine(); 
     String[] details = line.split("\\s+"); 

     String regNumber = details[0]; 
     String name = details[1]; 
     String modOne= details[2]; 
     int courseM = Integer.parseInt(details[3]); 
     int examM = Integer.parseInt(details[4]); 
     String modTwo = details[5]; 
     int courseM2 = Integer.parseInt(details[6]); 
     int examM2 = Integer.parseInt(details[7]); 
     String modThree = details[8]; 
     int courseM3 = Integer.parseInt(details[9]); 
     int examM3= Integer.parseInt(details[10]); 

     MarkProcessing p = new MarkProcessing(regNumber, name, modOne,courseM, examM, modTwo,courseM2,examM2, modThree, courseM3, examM3); 
     people.add(p); 
    } 


} 

}

當它關係到細節[1]我得到的指數錯誤。

+0

哪一行導致異常? – Scorpion

+3

讓它檢查拆分數組的大小,如果它小於11,則打印混亂的線條。 – CBredlow

+0

也許會添加文件和錯誤消息? –

回答

1

沒有關於輸入文件的信息,我會猜測這是因爲你的文件中有空行。如果是這種情況,你應該嘗試一下,以確保你有足夠的片斷。對此,你的while循環可以是這樣的。

while(sc.hasNextLine()){ 
    String line = sc.nextLine(); 
    String[] details = line.split("\\s+"); 
    if(details.length < 11) continue; // skip this iteration 
    ... 
} 

請記住,如果您要檢查每行至少11個項目,這隻會起作用。如果您需要解析輸入的更高級的方法,而他們可能有任何數量的課程。你最好考慮另一種方法,而不是直接從索引存儲值。

-1

要通過空間分割,你需要使用:

String[] details = line.split(" "); // "\\s+" -> does not split by space. 

在你的情況下,試圖通過正則表達式模式「// S +」,由於該分割線是找不到的,它認爲整行是一個字符串。在這種情況下,字符串數組的大小是1.沒有細節[1],因此你會得到這個錯誤。

+3

\\ s +分割任意數量的空格。這不是原因。 – Tristan

+0

在這裏查看'\\ s +'正則表達式:http://fiddle.re/5pk8j =>它匹配任意數量的空格... – donfuxx

0

您應該在解析它之前嘗試打印這一行,以便查看是什麼導致它炸燬。

String line = sc.nextLine(); 
    String[] details = line.split("\\s+"); 

    String regNumber = details[0]; 
    String name = details[1]; 
    String modOne= details[2]; 

你正在分裂的空間塊。如果遇到沒有空格的行,則只會有一個元素,因此details[1]會拋出IndexOutOfBoundsException

我的建議是仔細檢查您的輸入。它是否有尾隨換行符?如果是這樣,那可能會被解釋爲一條空行

130002 Bob B2123 35 34 B2132 34 54 B2143 23 34 
<blank line>