2016-05-06 15 views
0

input.txtファイルを使用して作成する接続コンポーネントグラフの数を数えるプログラムを作成しています。 input.txtファイル内のテキストは次のようになります。私は10またはより大きな数に最初の行データ番号7を変更したときに入力ファイルから数値を読み取る際にエラーが発生しました

7 6 (enter) 
0 1 (enter) 
1 2 (enter) 
2 0 (enter) 
0 3 (enter) 
3 2 (enter) 
4 5 (enter) 

そして、それがうまく機能は、しかし、これがなぜ起こるか

Exception in thread "main" java.lang.NumberFormatException: For input string: "0 " 
    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 Assignment41.main(Assignment41.java:28) 

私にはわからない、このようなエラーメッセージが表示さこれをデバッグする方法.. 何か考えていますか?

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 

public class Assignment41 { 
    public static void main(String[] args) throws IOException { 
     BufferedReader in; 
     try { 
      in = new BufferedReader(new FileReader("input.txt")); 

      String graphGuide; 
      graphGuide = in.readLine(); 

      int divider = graphGuide.indexOf(" "); 
      int NodeNum = Integer.parseInt(graphGuide.substring(0, divider)); 
      int EdgeNum = Integer.parseInt(graphGuide.substring(divider + 1)); 

      AdjList cc = new AdjList(); 
      for(int i = 0; i < NodeNum; i++){ 
       cc.insertVertex(i); 
      } 

      for(int j = 0; j < EdgeNum; j++){ 
       String temp; 
       temp = in.readLine(); 

       int v1 = Integer.parseInt(temp.substring(0, divider)); 
       int v2 = Integer.parseInt(temp.substring(divider + 1)); 
       cc.insertEdge(v1, v2); 
       cc.insertEdge(v2, v1); 
      } 

      for(int k = 0; k < NodeNum; k++){ 
       cc.BFS(k); 
       System.out.printf(" "); 
      } 

      System.out.println(); 
      System.out.println(cc.ccCount); 

      in.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

答えて

1

あなたはそれが空白を先頭または末尾いる場合Integerのために解析するとき、あなたのStringtrim()する必要があります。

それ以外の場合は、"0 "文字列(空白に気付く)は解析されず、NumberFormatExceptionがスローされます。例えば

int v1 = Integer.parseInt(temp.substring(0, divider).trim());

Stringをトリミング線らを破るなど、任意の先頭または末尾の空白を削除します。

docs hereを参照してください。

また、コードをデバッグし、整数値を表すサブStringが正しいインデックスで正確に解析されていることを確認することもできますが、それはもっと大変な作業かもしれません。

最後に、トリミング後に空の値など、解析する前にいくつかの基本的なチェックを実行する必要があります。

Rishalの回答では、String.splitを分割Stringに設定してください。

+0

を使用することができます

int divider = graphGuide.indexOf(" "); int NodeNum = Integer.parseInt(graphGuide.substring(0, divider)); int EdgeNum = Integer.parseInt(graphGuide.substring(divider + 1));

を使用して、私は私のコードを固定し、それでもエラーが発生し...と、この時間は、メッセージが 例外スレッドでは「メインのようです"java.lang.NumberFormatException:入力文字列の場合:" " \t at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) java.lang.Integer.parseIntでjava.lang.Integer.parseInt(Integer.java:592) \t(Integer.java:615) Assignment41.mainで\t(Assignment41.java:29) 何べきで私はこうします。 –

+0

これは、検索した 'String'のうちの別のものがトリミング後に空になったことを意味します。おそらく、分割方法が期待どおりに機能していない可能性があります。 – Mena

1

の代わりにあなたは非常によく

String divider[] = graphGuide.split(" "); 
      int NodeNum = Integer.parseInt(divider[0]); 
      int EdgeNum = Integer.parseInt(divider[1]); 
+0

それはあなたの問題を解決しましたか? –

関連する問題