MENU

【Java】finallyブロック内でclose()するとコンパイルエラーになることについて

 私は今、「スッキリわかるJAVA入門」を使って勉強しているんですが、その中の例題で指示された通りにコードを打ってもコンパイルエラーになってしまい、かなり苦戦した項目があったのでここにまとめておこうと思います。
 同書内では、「try-catch-finally構文」の説明に、FileWriterを用いてファイルにデータを書き込むプログラムが例示されているのですが、以下の通り打ち込んでコンパイルしようとすると、どうやってもエラーになってしまいます。

<Main.java

import java.io.*;
public class Main{
  public static void main(String[] args){
    try{
      FileWriter fw = new FileWriter("data.txt");
      fw.write("hello!");
    }catch(IOException e){
      System.out.println("何らかの例外が発生しました");
    }finally{
      fw.close();
    }
  }
}

 よく理解されている方にはすぐにわかってしまう問題だとは思うんですが、自分はこれを解決するのに結構苦戦しました・・・
色々調べてみると、結局このコードには2つの問題があったことがわかりました。



1 tryブロック内で宣言されている変数fwをfinallyブロック内で参照しようとしている。
 これは、tryブロックに入る前に、あらかじめ変数fwを宣言しておくことで解決できました。ちなみに、私は最初「FileWriter fw = 0;」と打ち込んで見事エラーを出しました・・・(´;ω;)

f:id:kumaGoro_95:20200729163543p:plain
コンパイルエラー1


<修正後コード>

import java.io.*;
public class Main{
  public static void main(String[] args){
    FileWriter fw = null;   //fwをtryブロックの外で宣言
    try{
      fw = new FileWriter("data.txt");
      fw.write("hello!");
    }catch(IOException e){
      System.out.println("何らかの例外が発生しました");
    }finally{
      fw.close();
    }
  }
}

  
 

2 close()メソッドに対しても例外処理が必要である。
 上記のコードでは、write()のメソッドには例外IOExceptionに対する処理がなされているが、close()のメソッドには例外処理がされていない。どちらのメソッドもFileWriterクラスのメソッドであり、両方に対して例外IOExceptionの処理をしなければならない。でも、例外的状況が発生した場合でも、close()メソッドは実行できるようにしたい・・・
 それを解決するには、try-finallyブロックを別のtryブロックで囲い、finally内のclose()メソッドにも例外処理を適用させます。

f:id:kumaGoro_95:20200729163614p:plain
コンパイルエラー2


<修正後コード>

import java.io.*;
public class Main{
  public static void main(String[] args){
    FileWriter fw = null;
    try{
      try{    //tryブロック内で例外処理を行う
        fw = new FileWriter("data.txt");
        fw.write("hello!");
      }finally{
        fw.close();
      }
    }catch(IOException e){
      System.out.println("何らかの例外が発生しました");
    }
  }
}

 

上記2点を修正すると、無事コンパイルできました!
プログラムも問題なく実行できました。

f:id:kumaGoro_95:20200729163906p:plain
無事書き込みができました