2016-09-26 6 views
25

したがって、私は本当に私を悩ます問題があります。私はjavaで作った単純なパーサーを持っています。関連するコードは次のとおりです。入力文字列 "1"のjava.lang.NumberFormatException

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

入力ファイルはCSVファイルで、ファイルの最初のエントリは整数です。私が解析を開始すると、私はimmidiatelyこの例外を取得:

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を持っていますが、私はまだメッセージが表示されます。私は、ファイルエンコーディングの可能性があると思う:それはUTF-8で、Unixのエンドラインが付いている。また、プログラムはUbuntu 14.04で実行されます。問題を探すための提案は大歓迎です。

+9

質問にエラーを入れるには、コピー&ペーストを使っていいですね! –

答えて

35

数字の前にBOMがあります。あなたの質問に"1"のようなものをコピーしてvimに貼り付けると、FE FF(たとえば、BOM)がその前に表示されています。そのリンクから:

BOMを構成する正確なバイトは、その変換フォーマットによってUnicode文字U + FEFFが何らかの形で変換されます。

は、だからそれが問題だ、ファイルがでエンコードされた変換(UTF-8、UTF-16ビッグエンディアン、UTF-16リトルエンディアンなど)のための適切なリーダーでファイルを消費します。 UnicodeファイルをJavaで読み取る方法については、this question and its answersも参照してください。

+1

@Doval:**ありがとうございました**私はそれがUTF-8 BOMであると言うのは絶対に間違っていました。しかし、私たちが見ているのは、ファイルを読み込んだ後でエラーメッセージの出力を見ることです。ファイルはどのような変換でもかまいません。すべてのBOMはFE FF *になります。 –

+0

しかし、もしそれが* raw *と読めば、...ああ、私は知らない。 :-) UTF-16になっている可能性もあります。 :-)それは、ファイルがストリームにどのように読み込まれたかによって異なります。 –

+1

"すべてのBOMはFE FFになりました。" - まあまあです。すべてのBOMはU + FEFFになります(これはバイトのシーケンスではなくコードポイントなので0xFE 0xFFと同じではありません)。デコードする前に、あなたが持っているのはバイトです。これは、Unicode文字(主にUTF-8とUTF-16が存在するが、他のものが存在する)を表すことができるエンコードである可能性があります。 – Kevin

関連する問題