例外とは
例外は、プログラム上で想定外の動作が行われ、処理が続行できなくなったことを通知するためのオブジェクトです。
例外を使えば、コードの正常処理と以上処理をある程度分離できるため、コードが読みやすくなります。
エラーと例外の違い
Java実行中のトラブルは,エラーと例外の2種類に分けられます。
エラー
実行環境のトラブル等、プログラムから対処不可能な事態。
プログラムが続行できなくなり、強制終了してしまいます。
例外
プログラムから対処可能な事態。
エラーとは違い、動作を終わらせることなくプログラムを続行できます。
チェック(検査)例外
メソッドを記述する際、例外処理も書かないと怒られるのがチェック例外で、チェック例外は基本的に、正しいプログラムを書いていても避けられない例外です。例えば、参照したいファイルが壊れているとか、DB障害等がこれにあたります。
チェック例外はコンパイラがチェックする例外処理で、Exeptionやそのサブクラス等が対象です。
非チェック(検査)例外
例外処理を記述したかをコンパイラがチェックしない例外です。
非チェック例外はプログラマーが任意で記述するもので、RuntimeExcepitonクラスやそのサブクラス等が対象です。非チェック例外は基本的には避けられるエラーで、必ず記載しなければならないものではありません。
public static void main (String[] args) {
int[] ary = {1, 2, 3};
System.out.println(ary[3]);
}
上記のコードでは、配列aryの要素が3つしか無いのに、4番目を表示するように要求しています。
実行すると以下のようになります。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
配列の範囲外を見ようとしているというメッセージが出ました。
これに例外処理を追加して実行してみます。
class Main{
public static void main(String args[]){
try{
int[] ary = {1, 2, 3};
System.out.println(ary[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("例外です");
}
}
}
実行結果
例外です
例外処理が走りました。
try~catch~finaly文
class Sample {
public static void main (String[] args) {
int ary[] = {1, 2, 3};
System.out.println("開始");
try{
for (int i = 0; i < 4; i++){
System.out.println(n[i]);
}
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("配列の範囲を超えています");
}
finally{
System.out.println("配列を出力");
}
System.out.println("処理を終了");
}
}
tryの部分に例外が発生する可能性のある処理を記載し、catchの部分に例外が発生したときの処理を書きます。例外の種類によってcatchブロックをそれぞれに分けることもできます。finalyの部分で最後に実行される処理を記載します。
throwとthrows
throw
try~catchでの例外処理以外に、自分で例外を起こせるthrowという例外処理もあります。
void test (int num) {
if(num == 0) {
throw new IllegalArgumentException("引数が不正です");
}
}
testメソッドではnumという数値型を引数に指定しているにもかかわらず、if分でnumが0だった時に処理をするように書いています。
実行すると以下のようになります。
throw new IllegalArgumentException(“引数が不正です”);
throws
throwと名前は似ていますが処理内容は異なります。
throwsは、例外処理をメソッド内ではなく呼び出し元で行いたい時に、呼び出し元に呼ぶことができます。
import java.io.FileNotFoundException;
import java.io.FileReader;
class Sample {
public static void main (String[] args) {
System.out.println("例外スロー");
try {
methodA();
} catch(FileNotFoundException e) {
System.err.println(e.getMessage());
}
}
void methodA() throws FileNotFoundException {
FileReader aFile = new FileReader("aFile.txt");
}
}
実行結果
aFile.txt (No such file or directory)
処理が終わりました