我正在开发一个以
形式收录图书记录的程序<book #>,<name>,<publisher>
例如
123,Example Book,Publisher
之后,用户返回菜单,使用数字选择他们想要的选项。
每当字符串被带入空格时,我会在此菜单上获得java.util.InputMismatchException
。例如在上面的示例中使用'Example Book'。而如果是'ExampleBook',我就不会有这样的错误。
还有其他方法可以获得输入吗?
对于我一直使用的字符串keyboard.next()
,它不会选择\n
,我认为这可能是问题。
答案 0 :(得分:0)
StringTokenizer是一个遗留类 因兼容性原因而保留 虽然在新的情况下不鼓励使用它 码。任何人都可以推荐 寻求此功能使用 分裂方法的String或 而是java.util.regex包。
如果您使用类似String.split()的内容会发生什么情况,它应该返回一个数组中的字符串列表,您可以在它们之后工作吗?对不起,没有显示任何代码很难提出改进。 PS:什么是键盘?
答案 1 :(得分: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();
答案 2 :(得分:0)
如javadoc所述,java.util.Scanner
使用空白的默认分隔符。第123,Example Book,Publisher
行将被解释为两行:123,Example
和Book,Publisher
。很可能你只调用next()
一次(返回第一部分),然后当移动到菜单时,调用另一个下一个方法,可能是nextInt()
,它应返回一些选定的菜单项编号。但是它会尝试返回它无法解析/转换为int
的第二部分,从而抛出InputMismatchException
。
有几种方法可以解决这个问题。最简单的解决方案是让扫描器通过换行符而不是空格来划分输入(这不仅包括换行符,还包括空格和制表符以及一些更特殊的空格)。
keyboard.useDelimiter("\n");
此外,您的输入检查和异常处理应该更加健壮,以避免将来InputMismatchException
。尽可能使用hasNext()
方法及其类型特定的对手,例如hasNextInt()
。
也就是说,不要拨打Scanner
和StringTokenizer
。这只会让其他人感到困惑;)