例外処理とは

プログラム実行途中で発生した想定外の結果を例外(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があり、プログラム実行時に発生および対処できる例外です。

例外処理の確認

平均を計算するメソッドを作成して、

package sample;

public class Exception {

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

}

RuntimeExceptionの発生

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

RuntimeExceptionの対処

「ArithmeticException」は「RuntimeException」なので、何かしらプログラムで対処できるExceptionです。

	public static float calculateAverage(int score, int count) {
		if (count == 0) {
			return 0;
		}
		float answer = score / count;
		return answer;
	}

検査例外(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

非検査例外クラスはどれですか?

1)Throwable

2)Error

3)Exception

4)RuntimeException

問題4

検査例外クラスはどれですか?

1)Throwable

2)Error

3)Exception

4)RuntimeException