Javaの例外の種類を完全解説!Checked ExceptionとUnchecked Exceptionの違いとは?
生徒
「Javaの例外処理ってよく聞きますけど、例外の種類があるって本当ですか?」
先生
「はい、Javaでは例外に種類があって、大きく分けてChecked ExceptionとUnchecked Exceptionの2つがあります。」
生徒
「その2つってどう違うんですか?実際のコードでも違いがあるんですか?」
先生
「とても重要なポイントですね。それでは、Javaの例外の種類と違いについて、コード例を交えながら丁寧に解説していきましょう。」
1. Javaの例外とは?例外処理の基本
Javaでは、プログラムの実行中に発生するエラーを「例外(Exception)」と呼びます。例外は、コードの実行を途中で止めたり、予期せぬ動作を防いだりするために重要な仕組みです。
Javaの例外は、オブジェクトとして扱われ、Exceptionクラスを継承することでさまざまな種類が存在します。
2. Checked Exception(チェック例外)とは?
Checked Exceptionは、Javaでコンパイル時にチェックされる例外です。これは、プログラムの構文チェック時に、必ずtry-catchブロックやthrowsキーワードで対処する必要があります。
代表的な例としては、IOExceptionやSQLExceptionがあります。ファイル操作やデータベース接続など、外部とのやりとりが関係する場面で発生することが多いです。
import java.io.FileReader;
import java.io.IOException;
public class CheckedExample {
public static void main(String[] args) {
try {
FileReader reader = new FileReader("sample.txt");
reader.read();
reader.close();
} catch (IOException e) {
System.out.println("ファイル操作中にエラーが発生しました: " + e.getMessage());
}
}
}
このコードでは、FileReaderを使う際にIOExceptionが発生する可能性があるため、try-catchで囲む必要があります。
3. Unchecked Exception(非チェック例外)とは?
Unchecked Exceptionは、実行時に発生する例外で、RuntimeExceptionを継承するクラスです。これは、コンパイル時に対処が強制されないため、try-catchが無くてもコンパイルは通ります。
代表的な例外として、NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsExceptionなどがあります。
public class UncheckedExample {
public static void main(String[] args) {
String text = null;
System.out.println(text.length()); // NullPointerException
}
}
このコードでは、nullの文字列に対してlength()を呼び出しており、NullPointerExceptionが実行時に発生します。
4. CheckedとUncheckedの違いを比較
ここで、Checked ExceptionとUnchecked Exceptionの違いを表でまとめてみましょう。
| 項目 | Checked Exception | Unchecked Exception |
|---|---|---|
| 例外の種類 | IOException, SQLExceptionなど | NullPointerException, ArithmeticExceptionなど |
| コンパイル時チェック | 必要(try-catchやthrows) | 不要 |
| 継承元 | Exception | RuntimeException |
| 主な用途 | 外部リソースとのやりとり | プログラム内部のミスやバグ |
5. 実際のプロジェクトでの使い分け
実際のJavaアプリケーションでは、次のような使い分けをします:
- ファイル読み込みやDB接続などは
Checked Exception - nullチェックや割り算のゼロなど、プログラムのミスは
Unchecked Exception
Javaの例外処理では、開発者が適切な設計を行うことが求められます。不要にthrowsで宣言すると、逆に読みづらくなってしまうため注意が必要です。
6. 自作の例外クラスとChecked/Uncheckedの違い
Javaでは、独自の例外クラスを作成して、Checkedとして扱うか、Uncheckedとして扱うかを選べます。
// Checked Exception の例
class MyCheckedException extends Exception {
public MyCheckedException(String msg) {
super(msg);
}
}
// Unchecked Exception の例
class MyUncheckedException extends RuntimeException {
public MyUncheckedException(String msg) {
super(msg);
}
}
このように、Exceptionを継承すればCheckedになり、RuntimeExceptionを継承すればUncheckedとして動作します。
7. 例外処理のベストプラクティス
Java初心者の方には、例外を投げるだけでなく、どう設計すべきかも大切な視点です。
- 外部リソースの操作は必ず
try-catchで囲う NullPointerExceptionを防ぐために、nullチェックを徹底する- 意味のあるエラーメッセージをつける
- 独自の例外クラスは必要最小限にする
Javaの例外処理を適切に使い分けることで、バグの少ない、安全なコードを書くことができます。