2010-10-01 109 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。这只会让其他人感到困惑;)