Javaの例外処理についてのアウトプットをします!
例外とは
コンパイルが成功しても、実行した際にエラーが発生することがある。実行時に発生したエラーのことを例外と呼ぶ。例外が発生することを、「例外がスローされる」と言う。
例外クラスとchecked例外とuncheked例外の2種類に分類される。
checked例外はDBなどJava実行環境以外が原因で発生し、uncheked例外は実行中のプログラムが原因で発生する。checked例外は例外処理が必須である。
try-catch-finally
tryブロック、catchブロック、finallyブロックで構成される例外処理。
try | catch | 列3 |
---|---|---|
例外が発生しそうな箇所をtryブロックで囲む | 例外が発生した場合の処理を記述 | 例外の発生有無に関係なく実行する処理を記述 |
public class Main{
public static void main(String[] args){
String[] animal = {"猫","犬","兎"};
for(int i = 0; i < 4; i++) {
try{
System.out.println(animal[i]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("例外発生");
}finally{
System.out.println("必ず実行");
}
}
}
}
実行結果
猫
必ず実行
犬
必ず実行
兎
必ず実行
例外発生
必ず実行
上記のコードは配列には3つの要素が入っていて、for文で順番に配列の中身にアクセスしている。
しかし4回実行されるようになっているので4回目は「不正なインデックスを使って配列がアクセスされた」と言う例外が発生される。なのでcatchブロックの引数に(ArrayIndexOutOfBoundsException)と書いておけば、4回目の時に「不正なインデックスを使って配列がアクセスされた」という例外をcatchブロックで検知してcatchブロックの中の処理が実行される。finallyブロックは例外があってもなくても必ず実行される。
throws
try-catch-finally以外にもthrowsキーワードによる例外処理ができる。例外が発生する可能性のあるメソッドを定義する時「throws 発生する例外クラス名」と指定しておく。そのメソッド内で指定された例外が発生した場合、例外オブジェクトがメソッドの呼び出し元に転送される。
throwsの利点
throwsを利用しない場合の例外処理を見ていく。
class Test{
void live(....){
Animal animal = new Animal;
animal.eat(...);
animal.sleep(...);
}
}
class Animal{
void eat(...){
try{
...
}catch(ArrayIndexOutOfBoundsException e){
...
}
}
void sleep(...){
try{
...
}catch(ArrayIndexOutOfBoundsException e){
...
}
}
}
この方法でも問題ないがメソッドを定義する度に例外処理を書くことになっている。
もし同じ内容の例外処理であった場合コードが重複してしまうことになる。
throwsを利用した場合
class Test{
void live(....){
Animal animal = new Animal;
try{
animal.eat(...); //①
animal.sleep(...);//②
}catch(ArrayIndexOutOfBoundsException e){
//例外発生時の処理
}
}
}
class Animal{
void eat(...) throws ArrayIndexOutOfBoundsException{
//不正なインデックスを使って配列がアクセスされた例外が発生した場合、①(メソッドの呼び出し元)に例外オブジェクトを転送する
}
void sleep(...) throws ArrayIndexOutOfBoundsException{
//不正なインデックスを使って配列がアクセスされた例外が発生した場合、②(メソッドの呼び出し元)に例外をオブジェクト転送する
}
}
メソッド名の後に「throws ArrayIndexOutOfBoundsException」て記述しているのでメソッド内でArrayIndexOutOfBoundsExceptionの例外が発生した場合はメソッドの呼び出し元に例外を転送する。そしてメソッドの呼び出し元をtryブロックで囲んでいあるので、その下のcatchブロックでArrayIndexOutOfBoundsExceptionの例外オブジェクトをcatchでき例外発生時の処理が実行できる。
以上、Javaの例外処理についてでした
間違っている箇所や、便利な書き方があればご教授お願いいたします!