Java7の複数例外catchを調べてみた

もうリリース間近なJava7。Java7ではProject Coinと呼ばれる、様々な言語仕様についての改善が含まれています。
そのなかでも特に気になった複数例外のマルチキャッチについて、OpenJDKを使って、ちょっと調べてみました。

複数例外catchとは?

Java7では複数例外catchを簡単に記述することが出来ます。今までだと

try {
    ...
} catch(IOException e) {
    //IOException時の処理
} catch(ClassNotFoundException e) {
    //ClassNotFoundException時の処理
}

としていたのを

try {
    ...
} catch(IOException | ClassNotFoundException e) {
    //IOException or ClassNotFoundException時の処理
}

という形式で、一度に記述することが出来ます。
catch内でIOExceptionかClassNotFoundExceptionかを判別したい場合は、instanceofを使って

try {
    ...
} catch(IOException | ClassNotFoundException e) {
    if(e instanceof IOException) { //IOException時の処理 }
    if(e instanceof ClassNotFoundException) { //ClassNotFoundException時の処理 }
}

としてやることで判別可能です。*1また、キャストすることで、元のクラスのメソッドを呼び出すことも可能です。

注意点

注意点が1点だけ。

  • あるExceptionと、そのサブクラスを、複数例外catchでは記述できない

ということです。例えば以下のパターン

try {
    ...
} catch(IOException | FileNotFoundException e) {
    ...
}

この場合、FileNotFoundExceptionはIOExceptionのサブクラスなので、上記のように書くと、コンパイルエラーとなります。

*1:それならcatchを分けろって声が聞こえそうですが