1

I'm currently working with the Java Scanner class and I'm getting a very strange InputMismatchException. I initialize the scanner like this:

Scanner in = new Scanner(new File(fileName));

in.useDelimiter("\n?.*:");

When I call System.out.println(in.next());, it prints 1500 to the command line, which is the correct value. However, if I call System.out.println(in.nextInt()); the Scanner throws an InputMismatchException. I don't think I'm printing trailing newlines or whitespace, and I'm sort of lost as to why this is happening.

EDIT: Here's the data format for what I'm reading in:

Data Description:100 Next Data Description:200

EDIT: Calling Integer.parseInt(in.next()); results in a NumberFormatException: For input string: "1"00.

junkmail
  • 13
  • 3

1 Answers1

1

That InputMismatchException isn't strange at all, because your regex isn't cross-platform compatible. You're likely a Windows user, so your text file will have \r\n as it's line endings, not just \n.

Thus the proper pattern would be:

in.useDelimiter("\r?\n?.*:");

To accept \r\n or a single \n.

You could also try to work with System.lineSeparator() to support different line endings, but then you would need to wrap that with parenthese so the regex quantifier ? applies to both chars \r\n for Windows systems:

in.useDelimiter(String.format("(%s)?.*:", System.lineSeparator()));

The issue with that approach is that it fails when using Windows as the operating system, but receiving the file from somewhere else, which itself just uses \n. So I recommend the first approach.

Tom
  • 16,842
  • 17
  • 45
  • 54