30.
例外処理
例外処理とは
プログラム実行途中で発生した想定外の結果を例外(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