2016-04-06 15 views
0

私はハングマンゲームを作っており、最近単語をランダム化するためのファイル読み取り方法を実装しました。しかし、私はファイルの読者をテストしていたので、私はそれを読んだ後、私のコードがtry catchブロックをスキップするようになるまで、私はあまり遠くまでは行きませんでした。ここで は、このメソッドを使用して、コンストラクタからのラインです:try catch文をスキップしますか?

word = determineWord(); 

そして、ここでは、メソッドです:

String determineWord() { 
    String fileName = "HangmanWords.txt"; 

    String line = null; 

    try { 
     FileReader fileReader = new FileReader(fileName); 

     BufferedReader bufferedReader = new BufferedReader(fileReader); 

     while((line = bufferedReader.readLine()) != null) { 
      line = bufferedReader.readLine(); 
     } 

     bufferedReader.close();   
    } 
    catch(FileNotFoundException ex) { 
     System.out.println("Can't open file");     
    } 
    catch(IOException ex) { 
     System.out.println("Error reading file");     
    } 
    return line; 
} 

私が受け取るエラーは、ラインが最初はnullに設定されているので、私は信じている、NullPointerExceptionがあり、私のプログラムではwordをnullにすることはできません。

+4

try-catchブロックをスキップしません。しかし、各反復で2行を読み込み、lineがnullのときにループが終了するので、常にnullのLineの最終値を返しています。あなたが何をしようとしているのか分かりません。 –

+0

@JBNizet whileループをチェックし、読み込む行があるかどうかを調べます。行はファイルの最後の行として返されます。 –

答えて

2

whileループは反復ごとに2行を読み込みます。

while((line = bufferedReader.readLine()) != null) { 
    line = bufferedReader.readLine(); 
} 

再びループ本体で)のreadLineを(いけない

String line = null; 
while((line = bufferedReader.readLine()) != null) { 
      // do something about the line 
} 
+0

私はfinalLine =行をループに入れて返しました。答えをありがとう! –

+0

例外をキャッチすることはまったく良いコンベンションではありません。実際には非常に悪い習慣です。できる例外と例外をキャッチして、処理しようとします。 –

+0

@JBNizet私はそれを修正します、ありがとう! – haifzhan

1

whileループが正しくありません。その後の状態はline == nullであり、正確にはあなたのプログラムがいつでもlineを残す状態です。

個別の変数を作成し、ファイルからランダムにlineに設定する必要があります。あなたは、テキストファイルにある行数を先行知っている限り

private Random rnd = new Random(); 

String determineWord() { 
    String fileName = "HangmanWords.txt"; 

    String res = null; 

    try { 
     FileReader fileReader = new FileReader(fileName); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     String line = null; 
     int count = 1; 
     while((line = bufferedReader.readLine()) != null) { 
      if (res == null || 4*rnd.nextInt(count) > count) { 
       res = line; 
      } 
      count++; 
     } 

     bufferedReader.close();   
    } 
    catch(FileNotFoundException ex) { 
     System.out.println("Can't open file");     
    } 
    catch(IOException ex) { 
     System.out.println("Error reading file");     
    } 
    return res; 
} 

驚くべきことに、プロセスは、ややトリッキーです:

はここで均一ではなくなる、それを行うための簡単な方法です。均一な方法でこれを行う方法については、reservoir sampling algorithmを参照してください。

1

あなたは2回、ファイルの最後の後に読んでいます。返す行にnullが割り当てられています。読んだり読んだりする前にチェックをすることができます。

1

あなたのコードが間違っている:それは、代わりに一つだけの反復ごとに2行を読み込み、それは常にnullである行を返し、それがループの停止条件です。コードは、エラーがあった場合、私はまた、ヌル、またはいくつかのランダムな行を返す避けるだろう

String lastReadLine = null; 
while((line = bufferedReader.readLine()) != null) { 
    lastReadLine = line; 
} 
return lastReadLine; 

のようなものでなければなりません。例外がある場合は何も起こらないかのように続行すべきではありません。それをキャッチする代わりにそれを投げる。

そして何が起きたとしても、読者が閉じていることを確認する必要があります。これはtry-with-resourcesステートメントが対象です:

String determineWord() throws IOException { 
    String fileName = "HangmanWords.txt"; 

    try (FileReader fileReader = new FileReader(fileName); 
     BufferedReader bufferedReader = new BufferedReader(fileReader)) { 

     String line = null; 
     String lastReadLine = null; 
     while((line = bufferedReader.readLine()) != null) { 
      lastReadLine = line; 
     } 
     return lastReadLine; 
    } 
}