これからJavaの例外処理に関する問題に取り組みましょう。
問題
次のコードが実行されたときの結果はどれでしょうか?正しいものを選んでください。
import java.io.FileNotFoundException;
import java.io.FileReader;
public class ExceptionTest {
public static void main(String[] args) {
try {
FileReader file = new FileReader("nonexistentfile.txt");
System.out.println("File opened successfully.");
} catch (FileNotFoundException e) {
System.out.println("File not found.");
} finally {
System.out.println("End of the program.");
}
}
}
選択肢
- A. File opened successfully. End of the program.
- B. File not found. End of the program.
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. File not found. End of the program.
解説
Javaでは例外処理としてtry-catch-finally
ブロックを使用します。
このコードで使われているFileReaderはチェック例外を発生させます。
チェック例外とは、コンパイル時に検出される例外のことで、この場合はFileNotFoundException
です。
ファイルが存在しないためにFileNotFoundException
がスローされ、catchブロックが実行されます。
そのため、出力は「File not found.」になります。
さらにfinally
ブロックが実行され「End of the program.」が続きます。
誤答理由
選択肢Aの「File opened successfully.」はファイルが正しく開かれた場合の出力ですが、今回ファイルは存在しないのでこれは不正解です。
選択肢Cのコンパイルエラーの場合、コードに文法ミスなどが存在すればコンパイルできませんが、今回は全て正しい構造になっています。
選択肢Dの実行時エラーも発生せず、正しい例外処理が行われています。
つまずきポイント
初学者がつまずきがちな点は、try-catch-finally
の流れとそれぞれの役割です。
特にfinally
ブロックは例外が発生しても必ず実行されるため、資源の解放(ファイルやネットワーク接続のクローズ)に用いることが多いです。
発展知識
非チェック例外とは、RuntimeException
のサブクラスにあたる例外で、コンパイル時には検出されず、実行時にのみスローされます。
例えば、NullPointerException
やArrayIndexOutOfBoundsException
がこれに該当します。
エラーは通常プログラムで対処できない状況で発生するもので、例としてはOutofMemoryError
が挙げられます。
エラーは通常、プログラム側ではなく環境によるものであるため、サーバーのリソース管理などシステム全体の問題として扱う必要があります。