第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
である。
例えば、クラス名とメソッド名が文字列で与えられたときに
- クラス名からデフォルト・コンストラクタでオブジェクトを生成し
- メソッド名から引数なしのメソッドを実行
するコードを書いてみる。
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) { ... }