Java 7では、catchブロックが改良され、複数の例外を単一のcatchブロックで処理できるようになりました。複数の例外をキャッチし、それらに類似したコードがある場合、この機能を使用するとコードの重複を減らすことができます。例を使ってJavaの複数の例外をキャッチする機能を理解しましょう。
Javaの複数の例外をキャッチする
Java 7以前では、以下のように一つずつ例外をキャッチしていました。
catch (IOException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
catch (SQLException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}
Java 7では、複数の例外を単一のcatchブロックでキャッチすることができます。
catch(IOException | SQLException ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
複数の例外をキャッチする場合、パイプ(|)を使用して区切ることができます。この場合、例外パラメータ(ex)はfinalであるため、変更することはできません。この機能によって生成されるバイトコードは小さくなり、コードの冗長性が減ります。
Javaの例外の再スロー
もう一つの改善点は、コンパイラによる再スローされる例外の解析です。Javaの例外の再スローは、メソッド宣言のthrows節でより具体的な例外タイプを指定することができます。小さな例を見てみましょう:
package com.journaldev.util;
public class Java7MultipleExceptions {
public static void main(String[] args) {
try{
rethrow("abc");
}catch(FirstException | SecondException | ThirdException e){
//下記の代入は、eがfinalであるためコンパイル時に例外が発生します
//e = new Exception();
System.out.println(e.getMessage());
}
}
static void rethrow(String s) throws FirstException, SecondException,
ThirdException {
try {
if (s.equals("First"))
throw new FirstException("First");
else if (s.equals("Second"))
throw new SecondException("Second");
else
throw new ThirdException("Third");
} catch (Exception e) {
//以下の代入は、Java 7の改良された例外の再投げの型チェック機能を無効にします
// e=new ThirdException();
throw e;
}
}
static class FirstException extends Exception {
public FirstException(String msg) {
super(msg);
}
}
static class SecondException extends Exception {
public SecondException(String msg) {
super(msg);
}
}
static class ThirdException extends Exception {
public ThirdException(String msg) {
super(msg);
}
}
}
rethrow
メソッドでは、catchブロックはExceptionをキャッチしていますが、throws句の一部ではありません。Java 7のコンパイラは、tryブロックが投げられる例外の種類を調べ、それがcatchブロックから再投げされるかどうかを分析します。ただし、catchブロックの引数を変更すると、この分析は無効になります。詳細はこちらをご覧ください:Javaにおける例外処理。
Source:
https://www.digitalocean.com/community/tutorials/java-catch-multiple-exceptions-rethrow-exception