Статический вложенный доступ к классу, бросающий NoClassDefFoundError


Я пытаюсь использовать служебный класс, состоящий из статических вложенных классов для общей функциональности. Эти статические вложенные классы реализуют интерфейс командного стиля:

public interface BooleanFunction{
    public boolean execute();
}

Класс, содержащий эти общие классы, реализующие этот интерфейс:

public class ExBooleans {

    public static class isComponentOpen implements BooleanFunction {

        private int widgetId;
        private int componentId;

        public isComponentOpen(int widgetId, int componentId) {
            this.widgetId = widgetId;
            this.componentId = componentId;
        }

        @Override
        public boolean execute() {
            return Widgets.getComponent(this.widgetId, this.componentId) != null;
        }
    }

Это должно называться так:

ExUtilities.makeCondition(new ExBooleans.isComponentOpen(RANGE_WIDGET_ID, RANGE_COOK_COMPONENT_ID), 1000)

Где makeCondition принимает a BooleanFunction:

public static boolean makeCondition (final BooleanFunction booleanFunction, int timeout){
    return Utilities.waitFor(new Condition() {
        @Override
        public boolean validate() {
            return booleanFunction.execute();
        }
    }, timeout);
}

Все это предназначено для обеспечения оболочки вокруг функции Utilities.waitFor(Condition c, int timeout) для более чистого чтения код.

Однако, когда я вызываю makeCondition, передавая в ExBooleans.isComponentOpen, я получаю ошибку времени выполнения:

Unhandled exception in thread ~threadnumber~: java.lang.NoClassDefFoundError: api/ExBooleans$isComponentOpen

На линии, содержащей вызов сверху:

ExUtilities.makeCondition(new ExBooleans.isComponentOpen(RANGE_WIDGET_ID, RANGE_COOK_COMPONENT_ID), 1000)
Любая помощь в решении этой проблемы будет очень признательна!
1 2

1 ответ:

Я смог решить эту проблему, вытянув методы interface и makeCondition в отдельный класс, в котором размещались как эти, так и утилитарные реализации isComponentOpen и т. д. Поскольку все они вложены в один класс, я больше не получаю ошибку, и код, вероятно, имеет больше смысла сгруппировать вместе.

Хотя я до сих пор не уверен, откуда взялась эта ошибка.