2017-07-07 2 views
1

現在Java Scannerクラスで作業していて、非常に奇妙なInputMismatchExceptionが発生しています。私はこのようなスキャナを初期化:私はSystem.out.println(in.next());を呼び出すときJava Scanner次のトークンがデータ型に適合するように見えても、InputMismatchExceptionがスローされます

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

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

、それが正しい値であるコマンドラインに1500を出力します。しかし、System.out.println(in.nextInt());と呼ぶと、スキャナはInputMismatchExceptionをスローします。私は後ろに改行や空白を印刷しているとは思わないが、なぜこれが起こっているのか分からない。

EDIT:

Data Description:100 Next Data Description:200

EDIT:NumberFormatException: For input string: "1"00Integer.parseInt(in.next());結果を呼び出すここで私は読んでいる何のためのデータ形式です。

+0

[私のための作品](http://ideone.com/bc7hyk) –

答えて

1

そのInputMismatchExceptionは、正規表現がプラットフォーム間で互換性がないため、まったく変わっていません。あなたはWindowsユーザーである可能性が高いので、テキストファイルの末尾には\r\nがあり、\nではありません。

したがって適切なパターンは次のようになります

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

\r\n又は単一\nを受け入れるします。

あなたはまた、別の行末をサポートするためにSystem.lineSeparator()で動作するように試みることができるが、正規表現の数量詞?は、両方の文字にWindowsシステム用\r\nを適用して、あなたはParentheseのであることをラップする必要があります:

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

このアプローチの問題は、オペレーティングシステムとしてWindowsを使用しているが、別の場所からファイルを受け取ったときに失敗するということです。それ自体は\nを使用しています。だから私は最初のアプローチをお勧めします。

+1

正規表現で '\ R'を使ってUnicodeの改行シーケンスにマッチさせることができるので、おそらく' \\ R?。*: "'より良いでしょう。 –

関連する問題