2

Com4Jを使用してMicrosoftOutlookを操作しています。Com4Jチュートリアルに従ってJavaタイプ定義を生成しました。これは、ユーザーが電子メールを閉じるのを待つコードの例です。

// Registers my event handler
mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder<Boolean> cancel) {
                // TODO Auto-generated method stub
                super.close(cancel);
                System.out.println("Closed");
            }
        }
    );

// Displays the email to the user
mailItem.display();

このコードは、ユーザーに電子メールを正常に表示します。残念ながら、"Closed"ユーザーがウィンドウを閉じたときにプログラムが印刷されることはありません。

4

1 に答える 1

4

Com4Jがイベントクラスを生成するとき(ItemEvents私のシナリオでは)、生成されたすべてのメソッドのデフォルトの動作は、をスローすることですUnsupportedOperationException(詳細についてはcom4j.tlbimp.EventInterfaceGeneratorクラスを参照してください)。

たとえば、匿名クラスがオーバーライドcloseするクラスのメソッドは次のとおりです。ItemEvents

@DISPID(61444)
public void close(Holder<Boolean> cancel) {
    throw new UnsupportedOperationException();
}

したがって、匿名クラスがを呼び出すsuper.close(cancel);と、親クラスはをスローし、実行が私のステートメントUnsupportedOperationExceptionに到達するのを防ぎます。System.out.println("Closed");したがって、私の匿名クラスは実際には次のようになっているはずです。

mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder<Boolean> cancel) {
                System.out.println("Closed");
            }
        }
    );

私を驚かせたのは、Com4Jがイベントハンドラーからスローされたものを完全に無視UnsupportedOperationExceptionしているように見え、実際に何が起こったのかを示さないことです。私はこのコードを次のように記述しました。

mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder<Boolean> cancel) {
                System.out.println("Getting ready to throw the exception...");
                throw new RuntimeException("ERROR! ERROR!");
            }
        }
    );

プログラムは次の出力を出力します。

例外をスローする準備をしています...

RuntimeExceptionただし、aがスローされたことを示すものはありません。

于 2010-07-12T11:18:37.707 に答える