2010-07-12 48 views
2

我正在使用Com4J與Microsoft Outlook進行交互。我已經根據Com4J tutorial生成了Java類型定義。以下是一些等待用戶關閉電子郵件的代碼示例。爲什麼我沒有通過Com4J接收COM事件?

// 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"

回答

3

當Com4J生成事件類別(在我的方案中爲ItemEvents)時,所有生成方法的默認行爲是引發UnsupportedOperationException(請參閱com4j.tlbimp.EventInterfaceGenerator類以瞭解詳細信息)。

例如,這裏是ItemEvents類的close方法,我的匿名類覆蓋:

@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!"); 
      } 
     } 
    ); 

程序發出這樣的輸出:

Getting ready to throw the exception...

然而,沒有任何跡象表明,RuntimeException被丟進。

相關問題