Bits of Java (トップ)

目次  前へ  次へ

デフォルトの例外処理

XMLEncoder や XMLDecoder による XML への保存、復元の際に発生する例外は設定されている java.beans.ExceptionListener オブジェクトによって処理されます。 ExceptionListener インターフェイスに定義されているメソッドは以下の1つのみです。

    public void exceptionThrown(Exception e)
このメソッドはエンコード時、デコード時に発生した例外が通知されるのでその際の処理を実装します。

プログラムにおいて setExceptionListener メソッドで ExceptionListener オブジェクトを設定していない場合や null を設定した場合にはデフォルトの ExceptionListener オブジェクトが適用されます。 デフォルトの ExceptionListener オブジェクトの exceptionThrown メソッドの動作は引数の Exception オブジェクトの toString メソッドの戻り値と "Continuing ..." という文字列を標準エラーに出力します。 よってデフォルトの XMLEncoder, XMLDecoder の動作として、例外発生時にはエラーメッセージを出力するだけで処理はそのまま続けられます。 ObjectOutputStream を使った直列化の際には1つでもフィールドの書き出しに失敗した場合などは例外により直列化そのものが失敗するので、可能な限り XML に状態を書き出そうとするこの動作は大きな違いと言えると思います。

独自の例外処理を行いたい場合には ExceptionListener インターフェイスを実装したクラスを作成して XMLEncoder や XMLDecoder の setExceptionListener メソッドで 作成したクラスのインスタンスを設定します。

下のプログラムでは Foo というクラスにデフォルトコンストラクタが無いために例外が発生します。 標準出力(エラー)には以下のように表示されます。

java.lang.InstantiationException: Foo
Continuing ...
java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new();
Continuing ...
-------------------- end encoding
decodedBean.getText() : aaa
decodedBean.getFoo() : null

/******************** Test.java ********************/
import java.beans.*;
import java.io.*;

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        SampleBean bean = new SampleBean();
        Foo foo = new Foo("foo");
        bean.setFoo(foo);
        bean.setText("aaa");
        XMLEncoder encoder = new XMLEncoder(
                                 new BufferedOutputStream(
                                     new FileOutputStream("sample.xml")));
        encoder.writeObject(bean);
        encoder.close();

        System.out.println("-------------------- end encoding");

        XMLDecoder decoder = new XMLDecoder(
                                 new BufferedInputStream(
                                     new FileInputStream("sample.xml")));
        SampleBean decodedBean = (SampleBean)decoder.readObject();
        decoder.close();
        System.out.println("decodedBean.getText() : " + decodedBean.getText());
        System.out.println("decodedBean.getFoo() : " + decodedBean.getFoo());
    }
}

/******************** SampleBean ********************/
public class SampleBean {
    private String text;
    private Foo foo;

    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public Foo getFoo() {
        return foo;
    }
    public void setFoo(Foo foo) {
        this.foo = foo;
    }
}

/******************** Foo.java ********************/
public class Foo {
    private String text;
    public Foo(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
}

/******************** sample.xml ********************/
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0_01" class="java.beans.XMLDecoder">
 <object class="SampleBean">
  <void property="text">
   <string>aaa</string>
  </void>
 </object>
</java>