字符串标记器,消毒输入?
我工作的一个程序,它在书中记录的形式字符串标记器,消毒输入?
<book #>,<name>,<publisher>
例如
123,Example Book,Publisher
之后,用户返回到菜单,用数字来选择哪个选项他们想。
我在这个菜单上得到一个java.util.InputMismatchException
,只要字符串被带入一个空格。例如上面的示例中的'Example Book'。而如果是'ExampleBook',我不会得到这样的错误。
是否有其他方式获得输入? 对于我一直在使用的字符串keyboard.next()
,其中不包含\n
,我认为这可能是问题所在。
示例如何使用扫描器类
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();
从文档为StringTokenizer
的StringTokenizer是传统类 被保留用于兼容性原因 虽然它的使用在新的代码 气馁。建议任何寻求此功能的 都使用String的 拆分方法或代替使用java.util.regex包的 。
如果你使用类似String.split()的东西,它应该返回一个数组中的字符串列表,你可以在它们工作时工作?对不起,没有显示任何代码很难提示改进。 PS:什么是键盘?
它不会抛出'InputMisMatchException'并且没有'next()'方法。所以他当然不会使用传统的'StringTokenizer'类:) – BalusC 2010-10-01 16:28:53
如其在javadoc中所述,java.util.Scanner
使用默认分隔符空白。行123,Example Book,Publisher
将被解释为两行:123,Example
和Book,Publisher
。很有可能你只需要拨打next()
一次(返回第一部分),然后当移动到菜单时,调用另一个下一个方法,可能是nextInt()
,它应该返回一些选定的菜单项号。但相反,它试图返回它根本无法解析/转换为int
的第二部分,从而抛出InputMismatchException
。
有几种方法可以解决这个问题。最简单的解决方案是让扫描器通过换行符而不是空白(它不仅覆盖换行符,而且还包括空格和制表符以及一些更特殊的空白)来分隔输入。
keyboard.useDelimiter("\n");
而且,你的输入检查和异常处理应该更加稳健,以避免将来InputMismatchException
秒。只要有可能,请使用hasNext()
方法及其类型专用计数器,如hasNextInt()
。
也就是说,不要拨打Scanner
a StringTokenizer
。这只会让其他人感到困惑;)
你能发布一个更完整的代码片段吗?这完全不清楚“键盘”是什么。 – 2010-10-01 16:06:26
你必须为'Scanner'指定一个有效的分隔符。 – BalusC 2010-10-01 16:07:39