Java を使い出すと誰もが経験するコンパイルエラーの紹介です。他の言語ではこのような厳しい制約はないような気もしますが、どなたか詳細教えていただけるとうれしいです。
スポンサーリンク
コンパイルエラーが発生するサンプルコード
import java.io.*; public class TempFileClass { public static void main(String[] args) { // 一時ファイルを生成 File tempFile = File.createTempFile("prefix", ".suffix"); // 生成した一時ファイルのフルパスを取得 String tmpFilePath = tempFile.getPath(); } }
コンパイル結果
E:\test>javac TempFileClass.java TempFileClass.java:17: エラー: 例外IOExceptionは報告されません。 スローするには、捕捉または宣言する必要があります File tempFile = File.createTempFile("prefix", ".suffix"); ^ エラー1個
コンパイルエラーの原因
File.createTempFile メソッドの I / F 定義は次のようになっています。
public static File createTempFile(String prefix, String suffix) throws IOException
I / F 定義によると、createTempFileメソッドは IOException 例外をスローするようになっています。 Java に限った話ではないかもしれませんが、RuntimeException 例外のように復旧ができそうもない例外 ( 補足しないほうが良い ) と上記の IOException 例外のように捕捉してアプリケーションで対処可能 ( ファイルがないなどのメッセージ表示など ) な例外が存在します。
Java では、補足しなければならない例外のことをチェック例外と呼び、RuntimeException 例外のように補足しないほうが良い例外を非チェック例外と呼びます。
コンパイルエラーの原因は、このチェック例外 ( IOException ) を捕捉していないことが原因です。よって次のように例外を捕捉するように修正することで、コンパイルエラーは発生しなくなります。
import java.io.*; public class TempFileClass { public static void main(String[] args) { try { // 一時ファイルを生成 File tempFile = File.createTempFile("prefix", ".suffix"); // 生成した一時ファイルのフルパスを取得 String tmpFilePath = tempFile.getPath(); } catch(IOException e) { System.err.println(e.getMessage()); } } }