Repast: невозможно вызвать метод из другого класса в Context Builder - PullRequest
0 голосов
/ 07 ноября 2019

Я не знаю, почему я получаю NullPointerException:

ERROR [AWT-EventQueue-0] 18:21:05,864 repast.simphony.ui.RSApplication - Error while initializing simulation
java.lang.NullPointerException
    at intraCity_Simulator.GlobalScheduler.load_data(GlobalScheduler.java:20)
    at intraCity_Simulator.Initialization_Builder.build(Initialization_Builder.java:306)
    at repast.simphony.dataLoader.engine.ClassNameContextBuilder.build(ClassNameContextBuilder.java:41)

Ниже приведен код. Запрос работает, когда я помещаю его непосредственно в инициализацию (построитель контекста), но когда я помещаю этот код в другой класс и вызываю его в конструкторе контекста, он сообщает об исключении NullPointerException.

public void load_data() {
    Context<Object> context = ContextUtils.getContext(this);
    Iterable<Object> readers = context.getObjects(DataReader.class);
    DataReader this_reader = null;
    Query<Object> reader_query = new PropertyEquals<Object>(context, "name", "parcel");
    for (Object o : reader_query.query()) {
        if (o instanceof DataReader) {
            this_reader = (DataReader) o;
        }
    }
    System.out.print(this_reader.getName());
}   

, когда я делаю это в контекстестроитель сообщает об исключении nullPointerException

GlobalScheduler gs = new GlobalScheduler();
context.add(gs);
gs.load_data();

ОБНОВЛЕНИЕ:

Я просто нахожу строку "Context context = ContextUtils.getContext (this);"не работает. контекст все еще нулевой. Почему? Но мне нужна эта строка, так как для запроса нужен контекст в качестве параметра.

Однако, если я последую вашему предложению передать контекст непосредственно в метод load_data (), он будет работать.

public void load_data(Context context) {
//      Context<Object> context = ContextUtils.getContext(this);
        DataReader this_reader = null;
        System.out.println("context  " + context);
        Query<Object> reader_query = new PropertyEquals<Object>(context, "name", "parcel");
        for (Object o : reader_query.query()) {
            System.out.println(o);
            if (o instanceof DataReader) {
                this_reader = (DataReader) o;
            }
        }
        System.out.print(this_reader.getName());
}

Почему я не могу определить контекст с помощью "Context context = ContextUtils.getContext (this);"? Этот метод работает, если он вызывается как метод в step (), но не работает, если он вызывается как метод в Context Builder.

1 Ответ

2 голосов
/ 07 ноября 2019

Что на самом деле там ноль? Без этого трудно сказать, является ли это вопросом обновления или просто исправлением ошибки нулевого указателя. Если это последнее, должно быть достаточно легко определить, какая переменная равна нулю, а затем, почему это так.

Тем не менее, вам, вероятно, не нужна эта строка

Context<Object> context = ContextUtils.getContext(this);

, если вы вызываете ее в ContextBuilder - просто передайте контекст в load_data (). Это, по крайней мере, позволило бы избежать нулевого контекста.

...