CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第9章 Java 7 の機能を復習する : 問題 4 : 複数例外と共通のスーパークラス

問題

Java ライブラリを使用しているとき、複数例外をキャッチすることで恩恵を得られる状況に遭遇したライブラリは何か?

解答

JAXP ライブラリ(javax.xml のサブパッケージ)でありがたいと思った。

例えば、XML ファイルを読んで DOM オブジェクトを生成するケースである。

I/O エラーはともかく、XML構文解析エラー(SAXException)と滅多に起きない JAXP 環境の不備(ParserConfigurationException)の各々にコードを書くのは嫌だ。

File xmlFile = ~;
try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(xmlFile);
    ...
} catch (ParserConfigurationException | SAXException ex) {
    ...
}

さらに問題

また、共通の例外となるスーパークラスにより恩恵を得られる状況に遭遇したライブラリは何か?

解答

何と言っても、Reflection を使ってメソッドを実行する際の ReflectiveOperationExceptionである。

例えば、クラス名とメソッド名が文字列で与えられたときに

  1. クラス名からデフォルト・コンストラクタでオブジェクトを生成し
  2. メソッド名から引数なしのメソッドを実行

するコードを書いてみる。

String className = ~;
String methodName = ~;

Class<?> clazz = Class.forName(className);   // ClassNotFoundException
Method method = clazz.getMethod(methodName); // NoSuchMethodException
Object object = clazz.newInstance();         // InstantiationException
                                             // IllegalAccessException
method.invoke(object);                       // InvocationTargetException
                                             // IllegalAccessException

4行のコードで何と5種類のチェック例外が起こる。
ところがReflectiveOperationExceptionは、これら5種類のチェック例外の親である。

ReflectiveOperationExceptionを使用

String className = ~;
String methodName = ~;
try {
    Class<?> clazz = Class.forName(className);
    Method method = clazz.getMethod(methodName);
    Object object = clazz.newInstance();
    method.invoke(object);
} catch (ReflectiveOperationException ex) {
    ...
}