2016-04-28 7 views
0

アイブ氏はreadDataメソッドが実行されると、それは整数のみと印刷要素である値を印刷する必要があります数字で構成されてdata.txtをファイル
12 45 345 500 45.67684 33は例外

を得たキャッチした後、ファイルを読み続けます 12 45 345 500要素有効ではありません33

私の問題ということは、要素一度ではありません。他のタイプのために有効ではありませんし、この

て、readData(「data.txtを」)のように継続すること 次がプリントアウトされます有効な声明私のコードは、それはちょうどそれが数である場合、私は、例外なく、チェックを使用しないことをお勧め12 45 345 500

要素有効でない
import java.io.*; 
import java.util.*; 

public class Ex7 { 

    public static void readData(String nameFile){ 

     try{ 
     BufferedReader br = new BufferedReader(new FileReader(nameFile)); 
     String line = br.readLine(); 
     int i = 0; 

     while((line != null)){ 
      try{ 
      String[] lines = line.split(" "); 
      int[] result = new int[lines.length]; 
      result[i] = Integer.parseInt(lines[i]); 

      if(result[i] ==(int)result[i]){ 
       System.out.print(result[i] + " "); 
      } 
      i++; 
     } 

     } 
     }catch(NumberFormatException e){ 
      System.out.println("element not valid "); 
     }catch(IOException e){ 
      System.out.println("IO error"); 
      System.exit(0); 
     } 
    } 

    public static void main (String[] args){ 
     readData("data.txt"); 
    } 
} 
+0

を、私は、try-のブラケットを検証while-と-ステートメントをキャッチするをアドバイス。 – Dominique

+0

あなたのtryキャッチが有効ではない、あなたは2つの試みが1つ閉じていないことがあります。また、whileループ自体でnumberformatexceptionを選択する必要があります。コード内で大きな変更を加えたくない場合は、 – MrSimpleMind

+0

Btw while((line!= null))whileはwhileの中で例外を処理するときには決して終了しません。 –

答えて

1

あなたの質問の理由は、発生する制御の流れを理解していないということです。

これはかなり簡単です:ファイルから読み込むループがあります。しかし、のキャッチはそのループの外にあります。だから、何かがスローされ、あなたがループの外側に「キャッチ」すると、そのループは「オーバー」になります。戻っていく方法はありません。

ので、すぐに答えは:NumberFormatExceptionがのためのtry/catchを移動する...それが実際:

try { 
    result[i] = Integer.parseInt(lines[i]); 
} catch (NumberFormatException ... 

しかし、もちろんのを発生することがあります場所...直接リードにあなたのコードに関する次の問題:配列を使って "有効な"入力を保存しようとしています...配列のサイズは固定です。どのメンバーが有効になるのか、事前にどのように知っていますか?あなたはそうしない。つまり、ArrayListからArrayListのような動的リストに変更する必要があります。これで "有効な"行を追加することができます。しかし、まあ、とにかくそれは本当に問題ではありません。あなたのメソッドはではないので、は収集した値を返します。しかし、データが使用されない場合、最初にそれを集めることには意味がありません。

コード変更以外の答えは、あなたがしなければならないことです。 あなたが実際に使っているコンストラクト/コンセプトが実際にどのように機能するかを学んでください。 try/catchを盲目的に入力することはありません。なぜなら、どこかに表示されているからです。IDEが、何らかの理由で例外について何かをする必要があるとあなたに伝えているからです。意味:あなたがコードを書き留めるとき...本当に本当にを理解してくださいこのコードは何をしているのですか?あなたが知っているように、他のステートメントif (result[i] == (int) result[i]) ...それは常に真実です。単に全く意味をなさない。

+0

私は今理解しているフィードバックのためにそんなに感謝します、私は間違いを見て、私が間違っていた – helpmewithjava

2

で停止33を印刷するために行くしません印刷されます。例外は遅く、フォールバックとしてのみ使用する必要があります。数値文字列の詳細や他の方法でgoogleを検索するには、このリンクをチェックしてください。 Numeric

0

ループ内にNumberFormatExceptionをキャッチするキャッチブロックを配置します。また、@ХристоСтайковの回答も考慮してください。

1

Whileの中にNumberFormatExceptionを入れてください。

public static void readData(String nameFile){ 

    try{ 
     BufferedReader br = new BufferedReader(new FileReader(nameFile)); 
     String line = br.readLine(); 
     int i = 0; 

     while((line != null)){ 
      try{ 
       String[] lines = line.split(" "); 
       int[] result = new int[lines.length]; 
       result[i] = Integer.parseInt(lines[i]); 

       if(result[i] ==(int)result[i]){ 
        System.out.print(result[i] + " "); 
       } 
       i++; 
      }catch(NumberFormatException e){ 
       System.out.println("element not valid "); 
      } 
     } 
    }catch(IOException e){ 
     System.out.println("IO error"); 
     System.exit(0); 
    } 
} 
0

以下のコードを使用します。あなたはNumberFormatExceptionがwhileループの外にcatchedさ

public static void readData(String nameFile) { 

      try { 
       BufferedReader br = new BufferedReader(new FileReader(nameFile)); 
       String line = br.readLine(); 
       String[] lines = line.split(" "); 
       int[] result = new int[lines.length]; 
       for(int i=0;i<lines.length;i++){ 
        try{ 
        result[i] = Integer.parseInt(lines[i]); 
        if(result[i] ==(int)result[i]){ 
          System.out.print(result[i] + " "); 
        } 
        }catch(NumberFormatException nfe){ 
         System.out.println("Number Invalid"); 
        } 
       } 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
      } 

     }