blog

jdk7 アップデート - 例外処理

上の例の try ブロックはどちらを投げてもかまいません。仮に、メソッドのthrows宣言で2つの例外型のうちどちらかを指定したい場合、jdk7ではそれができません。catchの例外パラメータeはEx...

Jun 16, 2020 · 2 min. read
シェア

、複数種類の例外処理

catch (IOException ex) {
 logger.log(ex);
 throw ex;
catch (SQLException ex) {
 logger.log(ex);
 throw ex;
}

モディファイド

catch (IOException|SQLException ex) {
 logger.log(ex);
 throw ex;
}

、キャプチャ上のコードを処理するときに例外をスローします。

static class FirstException extends Exception { }
 static class SecondException extends Exception { }
 public void rethrowException(String exceptionName) throws Exception {
 try {
 if (exceptionName.equals("First")) {
 throw new FirstException();
 } else {
 throw new SecondException();
 }
 } catch (Exception e) {
 throw e;
 }
 }

上記の例のtryブロックは、FirstExceptionとSecondExceptionのどちらかを投げることができます。jdk7では、メソッド宣言のthrowsで2つの例外型のいずれかを指定することはできません。catchの例外パラメータeはException型であり、catchブロックのrethrow例外eパラメータもException型であるため、メソッド宣言で宣言できるのは例外型がExceptionであることだけです。

 public void rethrowException(String exceptionName)
 throws FirstException, SecondException {
 try {
 // ...
 }
 catch (Exception e) {
 throw e;
 }
 }

jdk7 のコンパイラは、例外をスローする宣言は try ブロックから行う必要があり、また、すべての例外は FirstException または SecondException である可能性のある try ブロックから行う必要があると判断できます。であるにもかかわらず、コンパイラはそれが FirstException または SecondException のどのインスタンスであるかを判断できます。

jdkコンパイラの検出ロジック:

jdk7 または jdk7 以降では、コンパイラは例外を再スローするロジックを検証します:

1, try ブロックが例外をスローできること;

2, 他の catch ブロックが事前に処理できないこと。

3, catch節の例外引数のサブタイプまたは親タイプであること。

注意

キャッチ・ブロックのパラメータ e に他の値が指定されている場合、コンパイラのこの解析機能は無効になります。メソッドの例外宣言では、Exception 型の例外しか使用できません。

Read next

ES6 Essentials 13 - Promiseの他のメソッド

Promise1、Promise2、Promise3はすべて成功した後、成功をカウントします。

Jun 15, 2020 · 2 min read