2014-04-01 97 views
0

我正在寫一個程序,通過讀取各種類型的數據的文件。我試圖將文件中的數據傳遞給我創建的各種數組。從文件InputMismatchException當使用輸入掃描器

樣品部分(雙倍行距換行第一/姓氏和國家之間。之間類別標籤的空格,但空格是空格)

Name Age Country Year Closing Date Sport Gold Silver Bronze Total 

Joe Max 24 Algeria 2012 8/12/2012 Athletics 1 0 0 1 

Tom Lan 27 United States 2008 8/24/2008 Rowing 0 1 0 1 

當我的代碼編譯,但是,我得到InputMismatchException。我想知道它是否處理在每行結尾處沒有標籤的事實。任何人都可以幫助我通過這個?

public static void main(String[] args) { 
Scanner console = new Scanner(System.in); 
intro(); 

Scanner input1 = null; 
Scanner input2 = null; 
int lineCount = 0; 

try { 
    input1 = new Scanner(new File("olympicstest.txt")); 

} 
catch (FileNotFoundException e) { 
    System.out.println("Invalid Option"); 
    System.exit(1); 
} 

while (input1.hasNextLine()) { 
    lineCount++; 
    input1.nextLine(); 
} 

lineCount = lineCount - 1; 

String[] country = new String[lineCount]; 
int[] totalMedals = new int[lineCount]; 
String[] name = new String[lineCount]; 
int[] age = new int[lineCount]; 
int[] year = new int[lineCount]; 
String[] sport = new String[lineCount]; 

try { 
    input2 = new Scanner(new File("olympicstest.txt")); 
    input2.useDelimiter("\t"); 
} 
catch (FileNotFoundException e) { 
    System.out.println("Invalid Option"); // not sure if this line is needed 
    System.exit(1); // not sure if this line is needed 
}   

String lineDiscard = input2.nextLine(); 
for (int i = 0; i < lineCount; i++) { 
    name[i] = input2.next(); 
    age[i] = input2.nextInt(); 
    country[i] = input2.next(); 
    year[i] = input2.nextInt(); 
    input2.next(); // closing ceremony date 
    sport[i] = input2.next(); 
    input2.nextInt(); // gold medals 
    input2.nextInt(); // silver medals 
    input2.nextInt(); // bronze medals 
    totalMedals[i] = input2.nextInt(); 
} 

} 
+0

你說這是你的輸出,你不是這個意思嗎? –

+0

你是對的。它應該讀取輸入。現在解決。 – Rivers31334

回答

1

是,當你設置一個特定的分隔符,不幸的成爲用於不與你.next()報表發揮很好單獨值的唯一分隔符,所以您可以將標籤(\t)添加到每行的末尾,或者您可以使用正則表達式"[\t\n]"\t\n設置爲分隔符。我也更喜歡使用CSV格式,並用逗號分隔所有值,因爲製表符和空格字符通常與視覺角度無法區分,所以我發現後面使用/格式更容易

1

是的,你是對的是什麼導致問題。一個解決方案是在useDelimiter調用中使用正則表達式,它接受制表符和換行符。所以,你會怎麼做:

input2.useDelimiter("[\t\n]"); 

Explanation of the regex