2 votes

Pourquoi je ne reçois pas les événements COM via Com4J ?

Je utilise Com4J pour interagir avec Microsoft Outlook. J'ai généré les définitions de types Java conformément au tutoriel Com4J. Voici un exemple de code qui attend que l'utilisateur ferme un e-mail.

// Enregistre mon gestionnaire d'événements
mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder cancel) {
                // TODO Méthode générée automatiquement
                super.close(cancel);
                System.out.println("Fermé");
            }
        }
    );

// Affiche l'e-mail à l'utilisateur
mailItem.display();

Ce code affiche avec succès l'e-mail à l'utilisateur. Malheureusement, mon programme n'affiche jamais "Fermé" lorsque l'utilisateur ferme la fenêtre.

4voto

Adam Paynter Points 22056

Lorsque Com4J génère une classe d'événement (ItemEvents dans mon scénario), le comportement par défaut de toutes les méthodes générées est de renvoyer une UnsupportedOperationException (voir la classe com4j.tlbimp.EventInterfaceGenerator pour plus de détails).

Par exemple, voici la méthode close de la classe ItemEvents que ma classe anonyme remplace:

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

Par conséquent, lorsque ma classe anonyme appelle super.close(cancel);, la classe parente renvoie une UnsupportedOperationException, empêchant l'exécution d'atteindre mon instruction System.out.println("Fermé");. Par conséquent, ma classe anonyme aurait dû vraiment ressembler à ceci:

mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder cancel) {
                System.out.println("Fermé");
            }
        }
    );

Ce qui m'a surpris, c'est que Com4J semble simplement avoir ignoré l'exception UnsupportedOperationException lancée depuis le gestionnaire d'événements, ne me laissant aucune indication de ce qui s'est réellement passé. J'ai écrit ce code pour le démontrer:

mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder cancel) {
                System.out.println("Prêt à déclencher l'exception...");
                throw new RuntimeException("ERREUR! ERREUR!");
            }
        }
    );

Le programme émet cette sortie:

Prêt à déclencher l'exception...

Cependant, il n'y a aucune indication qu'une RuntimeException ait jamais été lancée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X