2

我正在使用 Com4J 与 Microsoft Outlook 进行交互。我已经按照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 回答