2

Java の宿題の基本的なファイル ハンドラーを作成しました。割り当てが戻ってきたとき、いくつかのインスタンスをキャッチできなかったというメモがいくつかありました。

  • ファイルからのバッファが null である可能性があります。
  • ファイルが見つかりませんでした
  • ファイル ストリームが閉じられませんでした

ファイルを開くために使用されるコードのブロックは次のとおりです。

/**
 * Create a Filestream, Buffer, and a String to store the Buffer.
 */
FileInputStream fin = null;
BufferedReader buffRead = null;
String loadedString = null;

/** Try to open the file from user input */
try
{
    fin = new FileInputStream(programPath + fileToParse);
    buffRead = new BufferedReader(new InputStreamReader(fin));
    loadedString = buffRead.readLine();
    fin.close();
}
/** Catch the error if we can't open the file */
catch(IOException e)
{
    System.err.println("CRITICAL: Unable to open text file!");
    System.err.println("Exiting!");
    System.exit(-1);
}

私が彼から持っていた唯一のコメントは、私がまったく持っていなかっfin.close();たブロックに入る必要があるということでした. finallyしかし、try/catch を作成した方法で、ファイルが開かないという問題を防ぐことができると思いました。

いくつかはっきりさせておきますが、これは現在の課題のためのものではありません (誰かに自分の仕事をさせようとしているわけではありません)。私はすでに自分のプロジェクトを作成しており、それについて採点されています。私自身、教授の推論を完全には理解していませんでした。最後に、私は Java の経験があまりないので、なぜ自分の Java がcatch不十分なのか少し混乱しました。

4

4 に答える 4

7
  • ファイルからのバッファが null である可能性があります。

ファイルが空である可能性があります。つまり、ファイルを開くとファイルの終わりに達します。loadedString = buffRead.readLine()その場合、null が返されます。

おそらく、次のようなものを追加してこれを修正する必要がありましたif (loadedString == null) loadedString = "";

  • ファイルが見つかりませんでした

コンストラクターのドキュメントで説明されているようにFileInputStream(String)FileNotFoundException. あなたはこれをあなたのIOException句でキャッチします(FileNotFoundException is であるため IOException)、それで問題ありませんが、おそらく次のことができたでしょう:

} catch (FileNotFoundException fnfe) {
    System.err.println("File not fonud!");
} catch (IOException ioex {
    System.err.println("Some other error");
}
  • ファイル ストリームが閉じられませんでした

fin.close()通常の状況では、どちらを呼び出してファイル ストリームを閉じます。おそらく、彼はそれが常に閉じているわけではないことを意味しています. はをreadLineスローする可能性がありIOException、その場合close()はスキップされます。それがfinally句にある理由です(これにより、 -block で何が起こっても確実に呼び出されtryます。(*)


(*) @mmyers が正しく指摘しているように、-block を呼び出すため、をブロックに入れるだけclose()finallyは実際には十分ではありません。それが本当に望ましい動作である場合は、catch 句でエラー フラグを設定し、このフラグが設定されている場合は finally 句の後に終了できます。System.exit(-1)catch

于 2010-05-27T18:53:35.470 に答える
3

tryしかし、プログラムがブロックの 2 行目または 3 行目に例外をスローした場合はどうなるでしょうか?

buffRead = new BufferedReader(new InputStreamReader(fin));
loadedString = buffRead.readLine();

この時点で、ファイルハンドルが開かれ、 に割り当てられていfinます。例外をトラップできますが、ファイルハンドルは開いたままになります。

fin.close()ステートメントをfinallyブロックに移動する必要があります。

} finally {
    try {
        if (fin != null) {
            fin.close();
        }
    } catch (IOException e2) {
    }
}
于 2010-05-27T18:52:51.440 に答える
1

例外buffRead.readLine()がスローされたとします。FileInputStreamこれまでに閉じられますか、それともその行はスキップされますか? ブロックの目的は、finally例外的な状況でもfinallyブロック内のコードが実行されるようにすることです。

于 2010-05-27T18:50:31.377 に答える
0

ファイルを開く以外にも、他にも多くのエラーが発生する可能性があります。

最終的に、null ポインター エラーから保護する必要がある定義済みまたは未定義の fin になる可能性があります。また、ファイルを閉じると新しい例外がスローされる可能性があることを忘れないでください。

私のアドバイスは、これを別のルーチンでキャプチャし、IOExceptions をそこから飛ばすことです。

何かのようなもの

private String readFile() throws IOException {
  String s;
  try {
    fin = new FileInputStream(programPath + fileToParse);
    buffRead = new BufferedReader(new InputStreamReader(fin));
    s = buffRead.readLine();
    fin.close();
  } finally {
    if (fin != null {
       fin.close()
    }
  }
  return s
}

そして、あなたがそれを必要とする場所:

try {
   loadedString = readFile();
} catch (IOException e) {
   // handle issue gracefully
}
于 2010-05-27T18:59:14.283 に答える