2012-01-26 29 views
1

ここでは、各行に整数を含むテキストファイルを読んでいます。複数回出現したすべての整数を出力しています。数値書式テキストファイルからの読み込み時の例外

私が見てきたように、ハッシュマップを使用して、キーと数値としての整数値を値として割り当てました。

ここでは、数値書式例外を取得しています。誰もこれで私を助けることができますか?

package fileread; 

import java.io.*; 
import java.util.HashMap; 


public class Main { 


public static void main(String[] args) { 
    // TODO code application logic here 
    HashMap<Integer, Integer> lines = new HashMap<Integer, Integer>(); 
    try { 
     FileInputStream fstream = new FileInputStream("C:/Users/kiran/Desktop/text.txt"); 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String str; 

     while ((str = br.readLine()) != null) { 

      Integer intObj = Integer.valueOf(str); 
      if (lines.containsKey(intObj)) { 
       int x = 0; 
       x = lines.get(intObj); 
       if (x == 2) { 
        System.out.println(intObj); 
       } 
       lines.put(intObj, x++); 

      } else { 

       lines.put(intObj, 1); 
      } 
     } 
     in.close(); 
    } catch (Exception e) { 
     System.err.println(e); 
    } 
} 
} 
+0

例外メッセージに、整数として解析しようとしたものが表示されます。 – hmjd

+1

'DataInputStream'は必要ですか?それが問題の原因になるのでしょうか? –

+1

@ nicholas.hauschildはい、そのDataInputStreamは不要です。 'Fstream'を' BufferedReader'コンストラクタに直接渡すことができます。 –

答えて

3

それはあなたの番号形式の例外は、このラインで起こっていることは非常に可能性があります:

  Integer intObj = Integer.valueOf(str); 

はここInteger.valueOf

のマニュアルを参照してください、私はラインの一つであるため、これは推測するだろう整数ではありません

+1

これは、例外がスローされる可能性のある唯一の場所です。ファイルの最後に余分な空白行などの単純なものがあります。その行にブレークポイント(またはprintln)を置いて 'str'の値を調べることで、違反者を見つけ出すことができます。 –

+0

@Rodney Gitzel:そうだよ。 –

3

デバッグの場合は、ループの最初に次のような行を追加することをお勧めします。

System.out.println("str = \"" + str + "\"");

私はあなたがNumberFormatExceptionがを取得すると思いますそのコードに見る唯一の場所がInteger.valueOfからです。私の推測では、空白や何か他のものがstrに入っていると思います。数値としてフォーマットしようとすると、失敗します。あなたはそれが起こったときにキャッチしようとする場合

代わりに、あなたは、このように周りInteger.valueofのtry/catchを追加してみてください:

Integer intObj = null; 
try 
{ 
    intObj = Integer.valueOf(str); 
} 
catch(NumberFormatException nfe) 
{ 
    System.err.println("The value \"" + str + "\" is not a number!"); 
} 

幸運を!

2

strをvalueOf()メソッドの引数として指定する前に、trim()メソッドを使用してみます。

str = str.trim(); 
Integer intObj = Integer.valueOf(str); 

し、ファイルの入力/出力を使用しているので、なぜ代わりに古いjava.ioパッケージを使用してのjava.nioパッケージを使用していません。それはjava.nioがこの種の作業に適しています。これを読んでくださいcomparison b/w java.nio and java.io

何らかの形で役に立つかもしれない希望。

ありがとうございます。

+0

+1トリムを言及してください。ファイル内の非印字文字が、私が今までに気にかけていたよりも多くのファイルスキャンを実行しました。 – Perception

+0

@受取:私も同じ懸念を持っています:-) Thankyou and Regards –