Необъяснимый NPE в OptaPlanner

Я получаю необъяснимое исключение NullPointerException в моей программе OptaPlanner:

09:52:08.016 [main] INFO  org.reflections.Reflections - Reflections took 44 ms to scan 1 urls, producing 5 keys and 5 values 
09:52:08.163 [main] INFO  o.o.core.impl.solver.DefaultSolver - Solving started: time spent (17), best score (-191hard/3350soft), environment mode (REPRODUCIBLE), random (JDK with seed 0).
Exception in thread "main" java.lang.NullPointerException
    at org.optaplanner.core.impl.solver.recaller.BestSolutionRecaller.updateBestSolution(BestSolutionRecaller.java:128)
    at org.optaplanner.core.impl.solver.recaller.BestSolutionRecaller.updateBestSolution(BestSolutionRecaller.java:123)
    at org.optaplanner.core.impl.constructionheuristic.DefaultConstructionHeuristicPhase.phaseEnded(DefaultConstructionHeuristicPhase.java:154)
    at org.optaplanner.core.impl.constructionheuristic.DefaultConstructionHeuristicPhase.solve(DefaultConstructionHeuristicPhase.java:102)
    at org.optaplanner.core.impl.solver.AbstractSolver.runPhases(AbstractSolver.java:87)
    at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:173)
    at JantermRunner.main(JantermRunner.java:28)

Я впервые использую OptaPlanner, поэтому я полностью уверен, что где-то ошибся, но эта ошибка на самом деле не дает мне никакой информации о том, где я ошибся, поскольку все упомянутые строки являются кодом OptaPlanner. (Строка 28 JantermRunner - это просто вызов solver.solve)

Обновлено: Чтобы быть ясным - я понимаю, что такое исключение нулевого указателя, я просто не знаю, как настроить мою программу OptaPlanner таким образом, чтобы она не вызывала ее где-то в будущем.

"(JantermRunner line 28 is just the call to solver.solve)" - вы тестировали, является ли solver нулевым? Вероятно, это так. Теперь оглянитесь назад, чтобы понять, почему.
Hovercraft Full Of Eels 16.05.2018 16:07

Возможный дубликат Что такое исключение NullPointerException и как его исправить?

Michael 16.05.2018 16:11

@HovercraftFullOfEels, но разве в этом случае stacktrace не будет состоять только из этой строки?

f1sh 16.05.2018 16:11

@ f1sh Нет. Это зависит от того, в какой момент разыменовывается параметр. Если solve не выполняет защитных проверок, вполне возможно, что он может оказаться на некотором пути вниз по иерархии вызовов, прежде чем будет разыменован.

Michael 16.05.2018 16:12

У меня - решатель не равен нулю.

Eliot J. Kaplan 16.05.2018 16:16

Определенно вызывается функция решения. Я предполагаю, что проблема возникает примерно в тот момент, когда копируется лучшее решение, но я не уверен.

Eliot J. Kaplan 16.05.2018 16:23

Это странно, я никогда не видел там NPE. Какой это номер версии?

Geoffrey De Smet 16.05.2018 18:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
108
1

Ответы 1

Готов поспорить, вы используете свой EasyScoreCalculator, и он возвращает null как Score.

Я настрою OptaPlanner, чтобы в этом случае отображалось хорошее сообщение об ошибке.

Другие вопросы по теме