当前位置: 首页 > 知识库问答 >
问题:

由于一个奇怪的NullPointerException,我在我的项目上耽搁了几个小时

樊令秋
2023-03-14

当运行我的问题的求解器时,我得到以下错误消息:

    Exception executing consequence for rule "addMarks" in com.abcdl.be.solver: [Error: getEndTime(): null]
    [Near : {... getEndTime() ....}] 
...

该消息表示规则“addmarks”中的方法getEndTime()返回null。下面是drools文件:

    // ############################################################################
// Hard constraints
// ############################################################################

rule "RespectDependencies" // Respect all the dependencies in the input file

    when
        Dependency(respected() ==  false)
    then
        scoreHolder.addHardConstraintMatch(kcontext, 0, -1);

end

rule "addMarks" //insert a Mark each time a process chain starts or ends

    when
        Node($startTime : getStartTime(), $endTime : getEndTime())

    then
        insertLogical(new Mark($startTime));
        insertLogical(new Mark($endTime));

end

rule "resourcesLimit" // At any time, The number of resources used must not exceed the total number of resources available

    when
        Mark($startTime: time)
        Mark(time > $startTime, $endTime : time)
        not Mark(time > $startTime, time < $endTime)
        $total : Number(intValue > Global.getInstance().getAvailableResources() ) from  
            accumulate(Node(getEndTime() >=$endTime, getStartTime()<= $startTime, $res : resources), sum($res))
    then
            scoreHolder.addHardConstraintMatch(kcontext, 1,  (Global.getInstance().getAvailableResources() - $total.intValue()) * ($endTime - $startTime));             
end

rule "masterDataManagement"  // Parallel loading is forbidden

    when
        $n1 : Node(md != "", $md : md, $id : id)
        $n2 : Node(id > $id, md == $md)  // We make sure to check only different nodes through the condition "id > $id"
        eval(Graph.getInstance().getPaths($n1, $n2).size() == 0)

    then
        scoreHolder.addHardConstraintMatch(kcontext, 2, -1);    
end

// ############################################################################
// Soft constraints
// ############################################################################

rule "MaximizeResources" //Maximize use of available resources at any time

    when
        Mark($startTime: time)
        Mark(time > $startTime, $endTime : time)
        not Mark(time > $startTime, time < $endTime)
        $total : Number(intValue < Global.getInstance().getAvailableResources() ) from  
            accumulate(Node(getEndTime() >=$endTime, getStartTime()<= $startTime, $res : resources), sum($res))

    then
        scoreHolder.addHardConstraintMatch(kcontext, 0, ($total.intValue() - Global.getInstance().getAvailableResources()) * ($endTime - $startTime)); 
end 



rule "MinimizeTotalTime" // Minimize the total process time
    when
        Problem($totalTime : getTotalTime())
    then
        scoreHolder.addSoftConstraintMatch(kcontext, 1, -$totalTime);
end

节点是规划实体,在规划实体中定义了返回null的方法getStartTime()和getEndTime()

规划实体代码

@PlanningEntity(difficultyComparatorClass = NodeDifficultyComparator.class)
        public class Node extends ProcessChain {

    private Node parent; // Planning variable: changes during planning, between score calculations

private int id; // Used as an identifier for each node. Different nodes cannot have the same id

public Node(String name, String type, int time, int resources, String md, int id)
{
    super(name, "", time, resources, "", type, md);
    this.delay = "";
    this.id = id;
}

public Node()
{
    super();
    this.delay = "";
}

@PlanningVariable(valueRangeProviderRefs = {"parentRange"}, nullable = false) 
public Node getParent() {
    return parent;
}

public void setParent(Node parent) {
    this.parent = parent;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String toString()
{
    if(this.type.equals("AND"))
        return delay;
    if(!this.md.isEmpty())
        return Tools.excerpt(name+" : "+this.md);

     return Tools.excerpt(name);
}

public boolean equals( Object o ) {
    if (o == this)
        return true;

    if (o instanceof Node) {
        return  
            this.name.equals(((Node)o).name);  
    } else {
        return false;
    }
}
 // ************************************************************************
// Complex methods
// ************************************************************************

 public int getStartTime()
 {
    return Graph.getInstance().getNode2times().get(this).getFirst();        
 }


public int getEndTime()
{ 
    return  Graph.getInstance().getNode2times().get(this).getSecond();   
}

 @ValueRangeProvider(id = "parentRange")
 public Collection<Node> getPossibleParents()
 {  
     Collection<Node> nodes = Graph.getInstance().getNodes();
     nodes.remove(this); // We remove this node from the list
     nodes.remove(Graph.getInstance().getParents(this)); // We remove its parents from the list
     return nodes;
 }

/**
 * The normal methods {@link #equals(Object)} and {@link #hashCode()} cannot be used because the rule engine already
 * requires them (for performance in their original state).
 * @see #solutionHashCode()
 */
public boolean solutionEquals(Object o) {
    if (this == o) {
        return true;
    } else if (o instanceof Node) {
        Node other = (Node) o;
        return new EqualsBuilder()
                .append(name, other.name)
                .isEquals();
    } else {
        return false;
    }
}

/**
 * The normal methods {@link #equals(Object)} and {@link #hashCode()} cannot be used because the rule engine already
 * requires them (for performance in their original state).
 * @see #solutionEquals(Object)
 */
public int solutionHashCode() {
    return new HashCodeBuilder()
            .append(name)
            .toHashCode();
}

这是非常奇怪的,因为node2times().get()不会为Graph类中的所有节点返回null。我做了一个测试以确定:

public class Graph {
 private ArrayList<Node> nodes;
...

 public void test()
{
   for(Node node : nodes)
    {
        int time = 0;
         try{
             time =  getNode2times().get(node).getFirst();
             System.out.print(node+"   :  "+"Start time  = "+time);
         }
         catch(NullPointerException e)
         {
             System.out.println("StartTime is null for node : " +node);
         }
         try{
         time = node.getEndTime();
         System.out.println("    End time = "+time);
     }
     catch(NullPointerException e)
     {
         System.out.println("EndTime is null for node : " +node);
     }

    }
}

...
}

共有1个答案

仉洲
2023-03-14

您重载的是node.equals()而不是node.hashcode()

您正在使用一个map:Node to times(如果我可以信任您使用的名称的话)。

这违反了在HashMap中使用对象作为键的约定。

 类似资料:
  • 我在React中得到以下警告 'React Hook useEffect缺少依赖项:'Bakerys'。包括它或移除依赖项数组。如果'set flatbakery'需要'bakerys'的当前值,您还可以用useReducer替换多个useState变量。(反作用-挂钩/穷尽-DEPS)‘ bakerys和Flatbakery是react状态变量。

  • 我不知道这个,但我得到了以下路线的stacktrace: 有什么明显的问题吗?

  • 问题内容: 这是成功的一个例子: 请注意,insert-select中的第二列是明确为null。 这是一个失败的示例: 请注意,在此示例中,我得到了,而不是第二列中的显式null ,它从delete语句作为null返回。 如果两个值都为null,那么第二个示例为什么会因为这个错误而困扰我?我已经仔细检查了两者,这是唯一的功能差异。 问题答案: 在第一个示例中,您为语句提供了一个 尚未输入类型的 N

  • 我想在react代码中使用axios从服务器获取数据。我将axios代码放入react组件的组件willmount中,如下所示。 但上面的代码给我带来了这样的错误 但当我对代码做了一些细微的修改,比如下面的代码时,一切都正常了。 我想说的另一件事是“this”对象在componentWillMount中是活动的 有人告诉我上面两种代码的区别吗?

  • 当我尝试编译这段代码时,Eclipse会出现以下两个错误: > 用于函数:maxmin的非法修饰符;只允许最终 对于:Mn不能解析为变量 为什么会出现这两个错误? 我想这可能已经回答了这个问题,但我不明白其中使用的术语。 这是我的代码:

  • 问题是,我正在测试一个方法,但它给我一个404错误,我已经把我的承载令牌在我的请求中,这是合乎逻辑的,因为我需要把头“授权”。当我在《邮差》中提出这个要求时,它给了我很好的结果。我有什么不及格的? monedaServiceTest.java: 输出控制台: