10

登録を解除しようとすると、クラスの 1 つで次のエラーが発生します。

java.lang.IllegalArgumentException: 注釈付きメソッドのイベント ハンドラーがありません。[DerivedClass] は登録されていますか?" at com.google.common.eventbus.EventBus.unregister(EventBus.java:227)

クラスの呼び出しunregister(this)には、パブリック@Subscribeアノテーション付きメソッドがあります。

4

2 に答える 2

18

問題は、エラー メッセージが、注釈に何か問題があると誤解させたことです。実際には、何らかの予期しない制御フローが原因で、クラスが自身を 2 回登録解除していました。

于 2012-08-08T03:54:42.490 に答える
4

ソースコードの説明:

/**
   * Unregisters all handler methods on a registered {@code object}.
   *
   * @param object  object whose handler methods should be unregistered.
   * @throws IllegalArgumentException if the object was not previously registered.
   */
  public void unregister(Object object) {
    Multimap<Class<?>, EventHandler> methodsInListener = finder.findAllHandlers(object);
    for (Entry<Class<?>, Collection<EventHandler>> entry : methodsInListener.asMap().entrySet()) {
      Class<?> eventType = entry.getKey();
      Collection<EventHandler> eventMethodsInListener = entry.getValue();

      handlersByTypeLock.writeLock().lock();
      try {
        Set<EventHandler> currentHandlers = handlersByType.get(eventType);
        if (!currentHandlers.containsAll(eventMethodsInListener)) {
          throw new IllegalArgumentException(
              "missing event handler for an annotated method. Is " + object + " registered?");
        }
        currentHandlers.removeAll(eventMethodsInListener);
      } finally {
        handlersByTypeLock.writeLock().unlock();
      }
    }
  }
于 2013-07-27T09:59:01.470 に答える