例外処理とは

プログラム実行途中で発生した想定外の結果を例外(Exception) といい、その記述したコードを例外処理(エラーハンドリング) といいます。

正常系と異常系

例外といっても、さまざまな種類があります。

  • メモリ不足
  • 外部ファイルが読み込めない
  • 変数がNullになった
  • 計算処理できない

これら例外は大きく2つの種別にわけられます。

  • 正常系
  • 異常系(例外)

正常系

例えば数値の割り算で、割る数が「0」のときは例外ArithmeticExceptionが発生します。

int score = 100;
int count = 0;
//エラーが発生
float answer = score / count;

例外の回避

この処理は変数countが「0」にならなければ、例外となりません。

int score = 100;
int count = 0;
float answer = 0;
// if文で回避
if (count > 0) {
    answer = score / count;
} else {
    System.out.println("個数が間違っています。");
}

異常系

異常系は予期せないエラー発生し、プログラムを強制終了させないために例外処理をするケースです。

例外処理の構造

Javaの例外処理は、Throwableをスーパークラスとして、ErrorクラスとExceptionクラスにわけられます。

Throwableクラス

Throwableは、Javaのすべてのエラーと例外をスーパークラスで、Throw(投げる)からきています。

Error

Errorはメモリ不足(OutOfMemoryError)や、スタック領域のオーバーフロー(StackOverflowError)など、ハード的な致命的エラーなどで発生します。

Exception

Exceptionは、検査例外(Checked Exception)と非検査例外(Unchecked Exception)」にわけられ、例外が発生しても例外処理で回避できます。Exceptionは何かしら対処しなければコンパイルエラーになります。

RuntimeException

非検査例外にはRuntimeExceptionがあり、プログラム実行時に発生および対処できる例外です。

例外処理の方法

ファイル構成

sample/
└── ExceptionApp.java

平均の計算

平均を計算するcalculateAverage() メソッドを作成します。

package sample;

public class Exception {

	public static void main(String[] args) {
        int score = 100;
        int count = 0;
        float average = 0;
		average = calculateAverage(score, count);
		System.out.println(average);
	}
	
	public static float calculateAverage(int score, int count) {
		return score / count;
	}

}

RuntimeExceptionの発生

このプログラムを実行するとArithmeticExceptionが発生します。

RuntimeExceptionの対処

ArithmeticExceptionRuntimeExceptionなので、if文などのプログラムで対処でます。

    public static float calculateAverage(int score, int count) {
        if (count > 0) {
            return score / count;
        } else {
            System.out.println("個数が間違っています。");
            return 0;
        }
    }

検査例外(Exception)

RuntimeExceptionは非検査例外ですが、通常のException(検査例外)をみてみましょう。

FileReader

Javaでファイル読み込みをするには、FileReaderクラスを利用します。

FileReader インスタンス = new FileReader(ファイルパス);

FileReaderでファイルを読み込むメソッドを定義してみましょう。

public static void loadFile(String path) {
    FileReader reader = new FileReader(path);
}

Exception処理が必須

FileReaderクラスではファイルが存在しないときの例外FileNotFoundExceptionが必須なので、コンパイルエラーになります。検査例外を扱うには、例外処理の構文で対処します。

演習

問題1

エラー、例外のスーパークラスはどれですか?

  1. Throwable
  2. Error
  3. Exception
  4. RuntimeException

問題2

エラークラスはどれですか?

  1. Throwable
  2. Error
  3. Exception
  4. RuntimeException

問題3

非検査例外(Unchecked Exception)クラスはどれですか?

  1. Throwable
  2. Error
  3. Exception
  4. RuntimeException

問題4

検査例外(Checked Exception)クラスはどれですか?

  1. Throwable
  2. Error
  3. Exception
  4. RuntimeException