Java扫描仪的next(“。”)给我java.util.InputMismatchException

时间:2019-01-28 11:14:56

标签: java java.util.scanner

我正在使用以下方法测试Java扫描器:

Scanner s = new Scanner("hello");
String k = s.next(".");             // <<<<-----this line throws exception
System.out.println(k);

即使使用Pattern也会给我同样的例外。 我想念什么吗? 谢谢

2 个答案:

答案 0 :(得分:2)

Scanner.next(Pattern str)的文档说明:如果下一个标记与指定的模式匹配,则返回下一个标记

因此,如果您想在k中获得某种东西,则需要一个与hello匹配的模式,例如

  • .*:从零到无限的事物

    s.next(".*");
    
  • \\w+一到无限字字符

    s.next("\\w+");
    

通知:

  • 您的代码s.next(".");寻找任何填充,但是只有一次,您的字符串不匹配

  • 仅当默认定界符为space

    时,此代码才会读取第一个单词
    Scanner s = new Scanner("hello foo");
    System.out.println(s.next(".*"));      // hello
    
  • 因此该代码将完全读取codz,因为没有-字符

    Scanner s = new Scanner("hello foo");
    s.useDelimiter("-");
    System.out.println(s.next(".*"));      // hello foo
    

答案 1 :(得分:1)

您的模式匹配正好是一个字符的任何令牌。例如

Scanner s = new Scanner("h e l l o");
String pattern = ".";
while (s.hasNext(pattern))
    System.out.println(s.next(pattern));

将输出

h
e
l
l
o

,但是如果第一个令牌不匹配(例如"he l l o"中的令牌),则不会打印任何内容。您必须以其他方式使用不匹配的令牌。 如果您实际上想重新定义2个标记之间的分隔符,请改用useDelimiter()