2016年9月12日月曜日

マルチキャッチ

みなさん。 こんばんは。

今日は第1章「小さな言語使用の変更」のマルチキャッチを読みました。

・マルチキャッチ

javaSE7よりも前のバージョンでは、例外の種類ごとにcatchブロックを用意して、

例外処理を記述していました。

この方法では同じ例外処理を複数のcatchブロックに記述しなければいけないため、

煩雑なコードになりがちでした。そこで、

」avaSE7から複数の例外を1つのcatchブロックでキャッチできるマルチキャッチが導入されました。

これにより、異なる例外に対して同じ処理となる例外処理は、1つのcatchブロックにまとめることが

できるようになります。

ではソースコードを書いてみましょう。

public class MaltiCatchTest {

public static void main(String[] args) {
String param = args.length > 0 ? args[0] : "a";
try {
new MaltiCatchTest().testException(param);
System.out.println("end");
} catch (SampleAException | SampleBException e) { // 例外処理を一つにまとめる。
System.out.println("Exception Result " + e);
}
}

public void testException(String param) throws SampleAException, SampleBException{
switch (param) {
case "a":
throw new SampleAException();
case "b":
throw new SampleBException();
default :
break;
}
}

class SampleAException extends Exception {

}

class SampleBException extends Exception {

}

}

実行結果
Exception Result MaltiCatchTest$SampleAException

今回はargsパラメータに何も入力していなかったので、「SampleAException」 がthrowされました。

マルチキャッチの制約として継承関係の例外をキャッチできないことです。

以下はコンパイルエラーになります。

public class MaltiCatchTest2 {

public static void main(String[] args) {
String param = args.length > 0 ? args[0] : "a";
try {
new MaltiCatchTest2().testException(param);
System.out.println("end");
} catch (SampleDException | SampleCException e) {
// SampleDException例外とSampleCException例外は継承関係にあるためコンパイルエラー
System.out.println("Exception Result " + e);
}
}

public void testException(String param) throws  SampleCException,SampleDException{
switch (param) {
case "a":
throw new SampleCException();
case "b":
throw new SampleDException();
default :
break;
}
}
class SampleCException extends Exception {

}

class SampleDException extends SampleCException {

}
}

感想として、例外がまとめてかけるようになったのでコードがすっきりしましたね。


人気ブログランキングへ

0 件のコメント:

コメントを投稿