web-dev-qa-db-ja.com

入力文字列 "1"のjava.lang.NumberFormatException

ですから、本当に気になる問題があります。 Javaで作成した単純なパーサーがあります。関連するコードは次のとおりです。

while( (line = br.readLine())!=null)
{
    String splitted[] = line.split(SPLITTER);
    int docNum = Integer.parseInt(splitted[0].trim());
    //do something
}

入力ファイルはCSVファイルで、ファイルの最初のエントリは整数です。解析を開始すると、すぐに次の例外が発生します。

Exception in thread "main" Java.lang.NumberFormatException: For input string: "1"
at Java.lang.NumberFormatException.forInputString(NumberFormatException.Java:65)
at Java.lang.Integer.parseInt(Integer.Java:580)
at Java.lang.Integer.parseInt(Integer.Java:615)
at dipl.parser.TableParser.parse(TableParser.Java:50)
at dipl.parser.DocumentParser.main(DocumentParser.Java:87)

ファイルを確認しました。実際、最初の値は1です(そのフィールドに他の文字はありません)が、それでもメッセージが表示されます。これはファイルエンコーディングが原因である可能性があると思います。Unixエンドラインを備えたUTF-8です。そして、プログラムはUbuntu14.04で実行されます。問題を探す場所についての提案は大歓迎です。

25
Milan Todorovic

その番号の前に [〜#〜] bom [〜#〜] があります。質問で"1"のように見えるものをコピーして、vimに貼り付けると、FE FF(たとえば、 [〜#〜] bom [〜# 〜] )その前に。そのリンクから:

BOMを構成する正確なバイトは、その変換形式によってU + FEFFが変換されるUnicode文字になります。

それが問題なので、ファイルがエンコードされている変換(UTF-8、UTF-16ビッグエンディアン、UTF-16リトルエンディアンなど)に適したリーダーでファイルを使用します。 JavaでUnicodeファイルを読み取る方法の詳細については、 この質問とその回答 も参照してください。

36
T.J. Crowder