2010-10-01 105 views
0

我工作的一個程序,它在書中記錄的形式字符串標記器,消毒輸入?

<book #>,<name>,<publisher> 

例如

123,Example Book,Publisher 

之後,用戶返回到菜單,用數字來選擇哪個選項他們想。

我在這個菜單上得到一個java.util.InputMismatchException,只要字符串被帶入一個空格。例如上面的示例中的'Example Book'。而如果是'ExampleBook',我不會得到這樣的錯誤。

是否有其他方式獲得輸入? 對於我一直在使用的字符串keyboard.next(),其中不包含\n,我認爲這可能是問題所在。

+1

你能發佈一個更完整的代碼片段嗎?這完全不清楚「鍵盤」是什麼。 – 2010-10-01 16:06:26

+1

你必須爲'Scanner'指定一個有效的分隔符。 – BalusC 2010-10-01 16:07:39

回答

0

示例如何使用掃描器類

String s = "1,1n,1b\n2,2n,2b\n2,2n,2b\n"; 
    Scanner sc = new Scanner(s); 
    StringBuilder sb = new StringBuilder(); 

    while (sc.hasNextLine()) { 
     String[] sa = sc.nextLine().split(","); 
     sb.append("nr:\t").append(sa[0]).append("\n"); 
     sb.append("\tbook name:\t").append(sa[1]).append("\n"); 
     sb.append("\tpublisher:\t").append(sa[2]).append("\n"); 
    } 

    System.out.println(sb.toString()); 

此打印出:

nr: 1 
    book name: 1n 
    publisher: 1b 
nr: 2 
    book name: 2n 
    publisher: 2b 
nr: 2 
    book name: 2n 
    publisher: 2b 

注意在使用文件時,不要忘記後關閉:

Scanner sc = new Scanner(new File("input.data")); 
... 
sc.close(); 
0

從文檔爲StringTokenizer

的StringTokenizer是傳統類 被保留用於兼容性原因 雖然它的使用在新的代碼 氣餒。建議任何尋求此功能的 都使用String的 拆分方法或代替使用java.util.regex包的 。

如果你使用類似String.split()的東西,它應該返回一個數組中的字符串列表,你可以在它們工作時工作?對不起,沒有顯示任何代碼很難提示改進。 PS:什麼是鍵盤?

+0

它不會拋出'InputMisMatchException'並且沒有'next()'方法。所以他當然不會使用傳統的'StringTokenizer'類:) – BalusC 2010-10-01 16:28:53

0

如其在javadoc中所述,java.util.Scanner使用默認分隔符空白。行123,Example Book,Publisher將被解釋爲兩行:123,ExampleBook,Publisher。很有可能你只需要撥打next()一次(返回第一部分),然後當移動到菜單時,調用另一個下一個方法,可能是nextInt(),它應該返回一些選定的菜單項號。但相反,它試圖返回它根本無法解析/轉換爲int的第二部分,從而拋出InputMismatchException

有幾種方法可以解決這個問題。最簡單的解決方案是讓掃描器通過換行符而不是空白(它不僅覆蓋換行符,而且還包括空格和製表符以及一些更特殊的空白)來分隔輸入。

keyboard.useDelimiter("\n"); 

而且,你的輸入檢查和異常處理應該更加穩健,以避免將來InputMismatchException秒。只要有可能,請使用hasNext()方法及其類型專用計數器,如hasNextInt()

也就是說,不要撥打Scanner a StringTokenizer。這隻會讓其他人感到困惑;)