字符串标记器,清理输入?

时间:2010-10-01 16:04:13

标签: java string validation

我正在开发一个以

形式收录图书记录的程序
<book #>,<name>,<publisher>

例如

123,Example Book,Publisher

之后,用户返回菜单,使用数字选择他们想要的选项。

每当字符串被带入空格时,我会在此菜单上获得java.util.InputMismatchException。例如在上面的示例中使用'Example Book'。而如果是'ExampleBook',我就不会有这样的错误。

还有其他方法可以获得输入吗? 对于我一直使用的字符串keyboard.next(),它不会选择\n,我认为这可能是问题。

3 个答案:

答案 0 :(得分:0)

来自StringTokenizer

的文档
  

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,ExampleBook,Publisher。很可能你只调用next()一次(返回第一部分),然后当移动到菜单时,调用另一个下一个方法,可能是nextInt(),它应返回一些选定的菜单项编号。但是它会尝试返回它无法解析/转换为int的第二部分,从而抛出InputMismatchException

有几种方法可以解决这个问题。最简单的解决方案是让扫描器通过换行符而不是空格来划分输入(这不仅包括换行符,还包括空格和制表符以及一些更特殊的空格)。

keyboard.useDelimiter("\n");

此外,您的输入检查和异常处理应该更加健壮,以避免将来InputMismatchException。尽可能使用hasNext()方法及其类型特定的对手,例如hasNextInt()

也就是说,不要拨打ScannerStringTokenizer。这只会让其他人感到困惑;)

相关问题