例外処理では、try-catch-finallyを使います。
catch句でreturnをした場合の挙動について気になったので、確認した結果を残しておきます。
##正常動作
###プログラム
public static void main(String[] args) {
try {
// try A
System.out.println("Try A-1");
try {
// try B
System.out.println("Try B");
} catch (NullPointerException e) {
System.out.println("Catch B:NullPointerException");
} finally {
System.out.println("finally B");
}
System.out.println("Try A-2");
} catch (Exception e) {
System.out.println("Catch A:Exception");
} finally {
System.out.println("finally A");
}
}
###動作結果
Try A-1
Try B
finally B
Try A-2
finally A
上から順に処理が流れる。
##例外発生
try BでNullPointerExceptionが発生したとすると・・・
###プログラム
public static void main(String[] args) {
try {
// try A
System.out.println("Try A-1");
try {
// try B
System.out.println("Try B");
// ここで例外発生!
throw new NullPointerException();
} catch (NullPointerException e) {
System.out.println("Catch B:NullPointerException");
} finally {
System.out.println("finally B");
}
System.out.println("Try A-2");
} catch (Exception e) {
System.out.println("Catch A:Exception");
} finally {
System.out.println("finally A");
}
}
###動作結果
Try A-1
Try B
Catch B:NullPointerException
finally B
Try A-2
finally A
例外をcatchしているので、この場合も上から処理が流れる。
##catch句でreturn
catch句でreturnをすると・・・
###プログラム
public static void main(String[] args) {
try {
// try A
System.out.println("Try A-1");
try {
// try B
System.out.println("Try B");
// ここで例外発生!
throw new NullPointerException();
} catch (NullPointerException e) {
System.out.println("Catch B:NullPointerException");
// cacth句の中でreturn
return;
} finally {
System.out.println("finally B");
}
System.out.println("Try A-2");
} catch (Exception e) {
System.out.println("Catch A:Exception");
} finally {
System.out.println("finally A");
}
}
###動作結果
Try A-1
Try B
Catch B:NullPointerException
finally B
finally A
例外をcatchしたところでreturnしているので、catch以降の処理(Try A-2)は処理されない。
ただし、finallyは処理される。
##catchしていない別の例外発生
try BでNullPointerException以外の例外が発生すると・・・
###プログラム
public static void main(String[] args) {
try {
// try A
System.out.println("Try A-1");
try {
// try B
System.out.println("Try B");
// ここでcatchしない例外発生!
throw new RuntimeException();
} catch (NullPointerException e) {
System.out.println("Catch B:NullPointerException");
return;
} finally {
System.out.println("finally B");
}
System.out.println("Try A-2");
} catch (Exception e) {
System.out.println("Catch A:Exception");
} finally {
System.out.println("finally A");
}
}
###動作結果
Try A-1
Try B
finally B
Catch A:Exception
finally A
例外をcatchしていないので、例外はスルーされるがfinallyは処理される。
##まとめ
とにかく
finallyは、例えその前でreturnされていても処理される!
###余談
仕事でプログラムを書くときはとにかく例外処理を入れるようにしています。
ただ、むやみやたらと例外処理を入れている(「その例外本当に発生する???」という)ソースも見かけます。
そこらへんは、ちゃんと見極めてコーディングしたいですね。