倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

入力の例外処理

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();
    }
}