[JavaSilver受験対策] 非検査例外と検査例外の違い


この記事は、シアトルコンサルティング株式会社 Advent Calendar 2021の8日目の記事です。
こんにちは、シアトルコンサルティングの村田です。

はじめに

Javaの例外クラスに関して非検査例外と検査例外の内容と違いを解説しており、下記の方を対象としています。

  • 非検査例外と検査例外ってなに
  • Javaシルバーの勉強中で例外についての問題が分からない

1. 例外は2種類に分けられる

 Javaには例外処理をしなくてもコンパイルエラーにならないクラスがあります。
これを非検査例外と呼び(コンパイラが検査しないから「非検査」)
try-catchやthrowsで例外ハンドリングをする必要がありません。
反対に例外ハンドリングが必要なクラスが検査例外です。
検査例外はハンドリングしなければコンパイルエラーになります。

 例外クラスは大きくError、Exception、RuntimeExceptionに分けられ、順にエラー、検査例外、非検査例外を表します。
(補足:RuntimeExceptionはExceptionクラスのサブクラスです)

2. 非検査例外について

 非検査例外(RuntimeException)には以下のようなものがあります。

  • NullPointerException
  • ArrayIndexOutOfBoundsException
  • IllegalArgumentException ...etc

 これらはわざわざ例外処理をする必要がない程度のエラーです。
nullチェック等は例外処理するまでもなくプログラムで回避できるでしょ?という理由だからです。

 例えば以下のサンプルコードでは、非検査例外であるRuntimeExceptionをthrowしているためコンパイルエラーにはなりません。
実装する際はこのうようにコンパイラがスルーしてしまうため、受け取る変数の中身や型を拾って対応しましょう。

public class Sample {
    public static void main(String[] args) {
            sample();
    }

    private static void sample() {
            throw new RuntimeException();
    }
}

3. 検査例外について

 検査例外(Exception)には以下のようなものがあります。

  • IOException
  • SQLException
  • InterruptedException ...etc  

 これらはコンパイル時に検査を行うためハンドリングしなければなりません。
読み込むファイルが壊れていたり、DBが壊れているという事象はプログラムでは回避できません。
そこでコンパイラによりハンドリングを強制されています。
 以下のサンプルコードでは、検査例外であるExceptionをthrowしている箇所で「処理されない例外の型 Exception」と、コンパイルエラーになります。

public class Sample {
    public static void main(String[] args) {
            sample();
    }

    private static void sample() {
            throw new Exception();
    }
}

4. コンパイルエラーの解消

コンパイルエラーを解消するには以下の2つの方法があります。
・throwsを用いる
・try-catchで例外ハンドリングする

■throwsを用いる
 対象メソッドと呼び出し元の両方で、throwsを用いてスローする可能性を宣言します。

public class Sample_1 {
    public static void main(String[] args) throws Exception{
            sample();
    }

    private static void sample() throws Exception{
            throw new Exception();
    }
}

■try-catchで例外ハンドリングする
 対象メソッドでthrows宣言および呼び出し元でのtry-catchによるハンドリングをします。

public class Sample_2 {
    public static void main(String[] args) {
        try {
            sample();
        } catch (Exception e) {
            System.out.println("error");
        }
    }

    private static void sample() throws Exception{
            throw new Exception();
    }
}

さいごに

 Javaシルバー学習のお供として分からなかったことをまとめました。
選択肢を絞るための一助としていただければと思います。

参考

(1) 志賀澄人 徹底攻略Java SE 11 Silver 問題集[1Z0-815]対応 株式会社インプレス 2019
(2) 25際で独立したフリーランスエンジニアじゃけえのあれこれ
【Java】検査例外と非検査例外の違いを図でまとめてみた
https://freelance-jak.com/technology/java/1157/