29.
例外処理
例外処理とは
プログラム実行途中で発生した想定外の結果を例外(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の対処
ArithmeticExceptionはRuntimeExceptionなので、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
エラー、例外のスーパークラスはどれですか?
- Throwable
- Error
- Exception
- RuntimeException
問題2
エラークラスはどれですか?
- Throwable
- Error
- Exception
- RuntimeException
問題3
非検査例外(Unchecked Exception)クラスはどれですか?
- Throwable
- Error
- Exception
- RuntimeException
問題4
検査例外(Checked Exception)クラスはどれですか?
- Throwable
- Error
- Exception
- RuntimeException