我正在使用Com4J与Microsoft Outlook进行交互。我已经按照Com4J tutorial生成了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"
。 最佳答案
当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
。