Java Optaplanner在解决过程中出现空指针异常-交叉引用对象和ReflectionPropertyAccessor类

Java Optaplanner在解决过程中出现空指针异常-交叉引用对象和ReflectionPropertyAccessor类,java,object,nullpointerexception,setter,optaplanner,Java,Object,Nullpointerexception,Setter,Optaplanner,我有两门课-Dev和Task任务在计划阶段分配给Devs。我的一个计划变量assignedDev具有如下设置器: public void setAssignedDev(Dev dev){ this.assignedDev=dev; dev.addToTasksAssigned(this); //null pointer exception here } 我需要保存一个任务的日志,该任务已分配给dev类中的每个dev,因此我有必要跨类引用此任

我有两门课-
Dev
Task
<代码>任务在计划阶段分配给
Dev
s。我的一个计划变量
assignedDev
具有如下设置器:

public void setAssignedDev(Dev dev){
    this.assignedDev=dev;       
    dev.addToTasksAssigned(this); //null pointer exception here
            }
我需要保存一个
任务
的日志,该任务已分配给
dev
类中的每个dev,因此我有必要跨类引用此任务

运行解算器时,会收到以下错误消息:

31:53.968 [main] INFO  o.o.core.impl.solver.DefaultSolver - Solving started: time spend (222), score (null), new best score (-36000hard/0soft), random seed (0).
Exception in thread "main" java.lang.IllegalStateException: The property (assignedDev) setter on bean of class (class taskassignment.domain.Task) throws an exception.
at         org.optaplanner.core.impl.domain.common.ReflectionPropertyAccessor.executeSetter(ReflectionPropertyAccessor.java:80)
at org.optaplanner.core.impl.domain.variable.PlanningVariableDescriptor.setValue(PlanningVariableDescriptor.java:308)
at org.optaplanner.core.impl.heuristic.selector.move.generic.ChangeMove.doMove(ChangeMove.java:66)
at org.optaplanner.core.impl.constructionheuristic.decider.ConstructionHeuristicDecider.doMove(ConstructionHeuristicDecider.java:101)
at org.optaplanner.core.impl.constructionheuristic.decider.ConstructionHeuristicDecider.decideNextStep(ConstructionHeuristicDecider.java:73)
at org.optaplanner.core.impl.constructionheuristic.DefaultConstructionHeuristicSolverPhase.solve(DefaultConstructionHeuristicSolverPhase.java:67)
at org.optaplanner.core.impl.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:190)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:155)
at taskassignment.app.TaskAssignmentHelloWorld.main(TaskAssignmentHelloWorld.java:39)
Caused by: java.lang.NullPointerException
at taskassignment.domain.Task.setAssignedDev(Task.java:119)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.optaplanner.core.impl.domain.common.ReflectionPropertyAccessor.executeSetter(ReflectionPropertyAccessor.java:75)
... 8 more
当ReflectionPropertyAccessor类(在Optaplanner软件中)调用bean
对象时,此错误来自ReflectionPropertyAccessor类中的此子句:

public void executeSetter(Object bean, Object value) {
    try {
        writeMethod.invoke(bean, value);
    } catch  //..... blah blah
这个类如何管理提供
任务
类的实例,但仍然生成空异常?
任务
显然不是空的(我甚至使用
if(this!=null)
子句进行了检查),那么它如何传递空值呢

有解决办法吗


如果我不清楚,请告诉我。非常感谢

我假定您从一个未初始化的解决方案开始,并让构造启发式对其进行初始化。在未初始化的解决方案中,所有
Task
实例都以
assignedDev
属性设置为
null
开始。在CH期间,解算器将定期将
assignedDev
属性设置为非null
Dev
实例,然后通过将其设置回
null
来撤消该更改。(撤销的原因与可伸缩性和性能的增量分数计算有关。)


因此在撤销过程中,它调用
writeMethod.invoke(someTask,null)
,调用
someTask.setAssignedDev(null)
,NPE位于
null.addToTasksAssigned(someTask)上。逻辑。

您经常谈到
Task
不指向null,但在我看来它看起来像
dev==null
这里:
dev.addToTasksAssigned(这个)//此处出现空指针异常
但是在这种情况下,为什么不在上面两行抛出空指针异常?上面两行是什么意思?不是
dev.addToTasksAssigned(这个)
任务。java:119