2011-02-03 14 views
1

最初の2行が整数mnであるテキストファイルがある場合は、それぞれnのパイプ区切りの値を持つm行があります。私はファイルを読み込んで、ファイルから値を持ってm*n配列を作成し、それは同じファイルで同じコードで突然、bajillion回のためにうまくいき、整数を読みながらNumberFormatExceptionを投げた最初の行から。全体のコードはここにある:Java throws NumberFormatException

public class Thegame extends JFrame { 
    public Integer st; 
    public Integer el; 
    public String[][] tab; 

    public Thegame(String pth) 
    { 
     setSize(640,480); 
     setTitle(pth); 
     File file = new File(pth); 
     try 
     { 
      BufferedReader rdr = new BufferedReader(new FileReader(file)); 
      st = Integer.valueOf(rdr.readLine()); 
      el = Integer.valueOf(rdr.readLine()); 
      tab = new String[st][el]; 
      for(Integer i=0; i<st; i++) 
      { 
       String lin = rdr.readLine(); 
       StringTokenizer spl = new StringTokenizer(lin,"|"); 
       for(Integer j=0; j<el; j++) 
       { 
        tab[i][j] = spl.nextToken(); 
       }     
      } 
      rdr.close();    
     } 
     catch(Exception ex) 
     { 
      JOptionPane.showMessageDialog(null, ex); 
     } 
    } 
} 

本当に私を心配何それが悪いことが判明したので、私も間違っている正確に何を言うことができない前とどこからともなく、同じコードは大丈夫働いていたということです...

+1

NumberFormatExceptionの原因となっている文字列は何ですか? – templatetypedef

+0

ええ、あなたはExceptionで得たスタックトレースを投稿してもらえますか?また、あなたが読んでいるファイルのコピー。 – Argote

+1

私は確信しています "理由はない"非常に強い声明です...あなたはパースしようとしている文字列のいくつかのシンプルなSystem.out.printlnを行うことができますか? (rdr.readLine()の結果)? – chahuistle

答えて

1

何かが変更されている必要があります。それ以外の場合は魔法です。考えられる容疑者:

  • 入力ファイルの内容が変更されました。あなたはある種の16進エディタでそれをチェックしましたか?ファイルは実際に数字で始まっていますか?
  • Java /システムロケールが変更されました。以前は数字として扱われていたものは、新しいロケールの番号ではなくなりました。ロケールでの一般的なキャッチは、千単位のセパレータ(、)です。
1

2の可能な問題の行は、次のとおりです。

st = Integer.valueOf(rdr.readLine()); 
el = Integer.valueOf(rdr.readLine()); 

あなたはどのような読者が読んでいることは、実際にIntegerであることを確認する必要があります。それはそれを修正しない場合、あなたは正しい入力をキャプチャしていることを確認する必要があり

st = Integer.valueOf(rdr.readLine().trim()); 
el = Integer.valueOf(rdr.readLine().trim()); 

は、以下の小さな変更を試してみてください。印刷された値が上がらない場合は

String stStr = rdr.readLine().trim() 
System.out.println(stStr); 
st = Integer.valueOf(stStr); 
System.out.println(stStr); 
String elStr = rdr.readLine().trim(); 
el = Integer.valueOf(elStr); 

:問題のデバッグに役立つ

、文字列に入力を保存し、それを解析しようとする前に、それがどのように見えるかを確認するためにそれを印刷するために役立つかもしれません整数でなければ、入力が間違っています。

0

ファイル内の最初の行の前に何らかの特殊文字が何らかの形で挿入されていましたか?私はその問題が一度あったことを知っています。何が起きているのかを理解するために私は永遠に苦労しました。私はメモ帳++がそうであるかどうか見ることができると思います。

0

動作が変更された場合、何かが変更されました。

コードが、その後変更されていない場合は、次のいずれかのファイルが読み込まれる

  • を変更:バイナリエディタで特別な(非読める)の文字を探してください。例外が発生しない入力ファイルがある場合は、入力ファイルと比較します(再び、16進数比較)。
  • Java環境が変更されました。Java仮想マシン構成の変更、特にlocaleを確認してください。
0

変更:

 st = Integer.valueOf(rdr.readLine()); 
     el = Integer.valueOf(rdr.readLine()); 

String input = rdr.readLine(); 
try { 
    st = Integer.valueOf(input); 
} catch(NumberFormatException e){ 
    System.out.println("exception reading " + input); 
} 
input = rdr.readLine(); 
try { 
    el = Integer.valueOf(input); 
} catch(NumberFormatException e){ 
    System.out.println("exception reading " + input); 
} 

なるようにし、問題の文字列がプリントアウトされているもののあなたの答えを得るでしょう。

関連する問題