Reader (BufferedReader) を扱う際の例外処理方法を見ていきます。 この例外処理の方法は java.io パッケージ内の Writer, InputStream, OutputStream でも同様に行えます。
例外処理を行わない場合
簡単なテストコード内など、あまり例外処理を行わなくても良さそうなところでは、IOException をそのまま外部へ投げてしまいましょう。
「resource.txt」というファイルを読み込む場合、以下のようにします:
void read1()throws IOException{ BufferedReader reader = new BufferedReader(new FileReader("resource.txt")); while(reader.ready()) System.out.println(reader.readLine()); reader.close(); }
ファイルの読み込み終了条件を Reader#ready() で判定していますが、実際にはマズイ場合もあるようです(→)。
キチンと例外処理を行う場合
Reader の例外処理で注意しなければいけないのは、読み込み中に例外が発生したとき、キチンと Reader をクローズしなければいけないことです。 これは finally 節を用いて対応します。
少々面倒なのは、この Reader#close() メソッドがまた IOException を投げることです。 finally 節の中にもまた try-catch 節を書かなければいけません:
void read2(){ BufferedReader reader = null; try{ reader = new BufferedReader(new FileReader("resource.txt")); while(reader.ready()) System.out.println(reader.readLine()); }catch(IOException ex){ // 読み込みに対する例外処理 }finally{ try{ if(reader != null) reader.close(); }catch(IOException ex){ // クローズ処理に対する例外処理 } } }
例外を区別しない場合
読み込み時(ready(), readLine() メソッドの呼び出しなど)とクローズ処理(close() メソッド呼び出し)で例外処理を変えない場合、次のように try-catch 節を2重にして書くこともできます:
void read3(){ try{ BufferedReader reader = null; try{ reader = new BufferedReader(new FileReader("resource.txt")); while(reader.ready()) System.out.println(reader.readLine()); }finally{ if(reader != null) reader.close(); } }catch(IOException ex){ // 例外処理 } }
さらに、例外処理を外部に丸投げするなら、次のようにも書けます:
void read4()throws IOException{ BufferedReader reader = null; try{ reader = new BufferedReader(new FileReader("resource.txt")); while(reader.ready()) System.out.println(reader.readLine()); }finally{ if(reader != null) reader.close(); } }