当前位置: 首页 > 知识库问答 >
问题:

扫描器分隔符与输入文件不按预期工作(Java)

曹超
2023-03-14
A:3
B:1
C:2
D:2
String fileName = "input.txt";
File file = new File(fileName);
Scanner in = new Scanner(file).useDelimiter(":");
while(in.hasNextLine()){
        String t = in.next();
        int n = in.nextInt();
        ....
}

当我试图在Eclipse中运行我的程序时,我收到以下错误:

在java.util.scanner.throwfor(Scanner.java:864),java.util.scanner.next(Scanner.java:1485),java.util.scanner.nextInt(Scanner.java:2117),java.util.scanner.nextInt(Scanner.java:2076),huffman_encoder.main(Huffman_encoder.java:26)

也就是说,int n=in.nextint();这一行引发了一个异常。我不知道为什么会这样。根据我对扫描器分隔符的理解,我应该跳过冒号,所以int n=in.nextint();应该将冒号后面的值放入n中。

操作系统是Windows10,如果这很重要的话。谢谢你。

编辑:在进一步的测试中,我发现错误发生在字符串t=in.next()之后;在显示'a'之后立即打印出t,然后程序在int n=in.nextint();抛出异常

共有1个答案

储臻
2023-03-14

扫描仪得到的实际输入是以下字符串:

A:3\nB:1\nC:2\nD:2

因此,快速修复方法是将\n添加到分隔符列表中:

Scanner in = new Scanner(file).useDelimiter("[:\n]");

然而,这可能并不严格正确,因为这将接受任何在字母和数字之间带有冒号或换行的流,例如:

A
3:B
4
 类似资料:
  • 因此,我是一个新的Java程序员,我正试图弄清楚为什么一段代码不能工作。我遇到的问题是“String interests=input.nextLine();”这一行,它跳过了用户的输入并跳转到下一个System.out,所以它只显示“Your Profile...”。在允许用户输入任何数据之前。抱歉,如果这是一个愚蠢的问题,我是很新的!

  • 问题内容: 我正在编写一个使用Event类的程序,该类中有一个日历实例和一个String类型的描述。创建事件的方法使用扫描仪获取月,日,年,小时,分钟和说明。我遇到的问题是Scanner.next()方法仅返回空格之前的第一个单词。因此,如果输入为“我的生日”,则该事件实例的描述就是“我的”。 我做了一些研究,发现人们使用Scanner.nextLine()解决此问题,但是当我尝试这样做时,它只是

  • 根据JavaAPI Scanner使用分隔符将整个输入分解为标记。我正在尝试理解标记和分隔符。我正在做这个程序,遇到了一个混乱 当我使用输入时,我得到以下输出。 我可以理解这个输出,因为分隔符之间的标记长度为零,因此所有标记都为零,但当我使用默认分隔符并将输入作为 <代码>\uuuuuuuaaa\n- 为此,我得到的输出为 我无法理解。我给了5个空格,所以它们之间应该有4个长度为0的标记。为什么不

  • 我这里有两个代码块。一个扫描器正确地等待用户输入,另一个则直接通过它并调用,返回。下面是工作的块: 下面是没有的块: 这两个都是单独的类,并且是从另一个类中的main方法调用的。基本上,调用,后者又调用某个Player类的方法...这是非工作代码所在的地方。程序中是否有不适合接受输入的时候?我的印象是,任何时候我需要用户输入,我都可以使用这种方法。谢谢!

  • 问题内容: 我想为扫描器指定一个分隔符,该分隔符可以按某种模式进行拆分,但不会从令牌中删除该模式。我似乎无法完成这项工作,因为正则表达式所标识的所有内容也会作为分隔符的一部分被占用。有什么建议? 我的具体问题是,我的文件看起来像: 我想从文本/数字混合+行中分离出来,直到下一个文本/数字混合。我有正则表达式来标识它们,但是如上所述,因为定界符占用了我想要的内容,所以使用了它。 编辑:代码添加: 是

  • 好的,我要学习一个CS安全类,里面有一些基本的java编程,我们的第一个任务是玩。然而,我们也必须“防弹”我们的计划。虽然我的方法不是最理想的,但除了第一次输入外,它仍然有效。如果我为任何