Java Silver試験に向けた例外処理の練習問題を解いていきましょう。
問題
次のプログラムを実行した場合、コンパイルエラーが発生します。その理由として正しい選択肢を選んでください。
class Calculator {
void divide(int a, int b) throws ArithmeticException {
if (b == 0) {
throw new ArithmeticException("Division by zero");
} else {
System.out.println("Result: " + (a / b));
}
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
try {
calc.divide(10, 0);
} catch (Exception e) {
System.out.println("Exception caught");
}
}
}
選択肢
- A. 例外がスローされても、例外がキャッチされるためコンパイルエラーは発生しない
- B. throwsキーワードをつけているため、例外処理が不適切である
- C. throwsキーワードがあるメソッドは、必ず例外をスローしないといけない
- D. Try-catchブロックが正しく例外を処理しているため、エラーは発生しない
答えと解説
回答を見る
答え
A. 例外がスローされても、例外がキャッチされるためコンパイルエラーは発生しない
解説
解説のポイント:
- 例外のスローとキャッチ
- checked例外とunchecked例外
基本説明:
このプログラムで使われている例外は、ArithmeticException
です。
この例外は実行時に発生するunchecked例外に属します。
Javaではunchecked例外については、明示的なcatchやthrows宣言が必要ありません。
誤答理由:
B:throwsを使うことが問題とはならないため、例外のスローだけでコンパイルエラーにはつながりません。
C:メソッド内で例外が実際に発生しなくても問題ありません。
つまずきポイント:
初学者がよく勘違いするのはthrowsがついている=例外を必ず発生させるという点です。
実際には、throwsはそのメソッドが例外をスローする可能性があることを示す記述です。
発展知識:
例外の種類にはcheckedとuncheckedがあり、正しい扱い方を理解することが重要です。
checked例外を扱う際には適切にthrows宣言するかtry-catchブロックで処理を行わせる必要があるため注意しましょう。