Когда 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!");
}
}
);
Программа выдает следующие выходные данные:
Getting ready to throw the exception...
Однако нет никаких признаков того, что RuntimeException
когда-либо был брошен.