[rules-users] Null Pointer Exception in "org.drools.reteoo.RuleTerminalNode.retractTuple"

Edson Tirelli tirelli at post.com
Fri Mar 23 08:35:16 EDT 2007


   Michael,

   Yes, this is certainly a bug. May I ask you please to open a JIRA for 
that and attach your sample code?

   A comment about "no-loop": it only prevents the rule activating 
itself... it does not prevent the rule from activating other rules that 
already fired. You must add an explicit constraint to avoid the 
activation of the rules you don't want to activate when modifying 
objects that are part of the matching pattern.

   Thank you in advance.

    Edson


Anstis, Michael (M.) wrote:

> Hi - me again :-(
>
> Unfortunately I receive a NPE (3.1-M1) as follows (a complete JAR 
> illustrating the problem is available):-
>
> **Java
>
> Man man=*new* Man();
> Machine machine=*new* Machine();
> Process p =* new* Process();
> wm.assertObject(man);
> wm.assertObject(machine);
> wm.assertObject(p);
>
> **Rules
>
> *package* drools.debug
>
> *rule* "Rule-1"
> *no-loop** true*
> *when*
>         $p : Process()
> *then*
>         System.out.println("DEBUG [Rule-1]---> Add ProcessAlternative 
> to Process");
>         ProcessAlternative pa =* new* ProcessAlternative();
>         $p.addProcessAlternative(pa);
>        * assert*(pa);
>        * modify*($p);
> *end*
>
> *rule* "Rule-2"
> *no-loop** true*
> *when*
>         $m : Machine()
> *then*
>         System.out.println("DEBUG [Rule-2]---> Add Machine to 
> MachineEntry");
>         MachineEntry me =* new* MachineEntry();
>         me.setMachine($m);
>        * assert*(me);
> *end*
>
> *rule* "Rule-3"
> *no-loop** true*
> *when*
>         $me : MachineEntry()
>         $pa : ProcessAlternative()
> *then*
>         System.out.println("DEBUG [Rule-3]---> Add MachineEntry to 
> ProcessAlternative");
>         $pa.addMachineEntry($me);
>        * modify*($pa);
> *end*
>
> //rule "Rule-4 (Null Pointer Exception)"
> //no-loop true
> //when
> //      $h : Man ( )
> //      $m : Machine ( )
> //      $mte : MachineEntry ( machine == $m )
> //then
> //      System.out.println("DEBUG [Rule 4]---> Assigned resource");
> //      $m.setManualResource($h);
> //      modify($m);
> //end
>
> **Output
>
> DEBUG [Rule-1]---> Add ProcessAlternative to Process
> DEBUG [Rule-2]---> Add Machine to MachineEntry
> DEBUG [Rule-3]---> Add MachineEntry to ProcessAlternative
>
> This is what I'd expect. If however rule "Rule-4" is uncommented the 
> output is:-
>
> DEBUG [Rule-1]---> Add ProcessAlternative to Process
> DEBUG [Rule-2]---> Add Machine to MachineEntry
> DEBUG [Rule-3]---> Add MachineEntry to ProcessAlternative
> DEBUG [Rule 4]---> Assigned resource
> DEBUG [Rule-2]---> Add Machine to MachineEntry          <-- Why 
> activated? no-loop is true
> DEBUG [Rule 4]---> Assigned resource                    <-- Presumably 
> activated as a consequence of above
>
> And I receive a NPE with the following stack trace:-
>
> _java.lang.NullPointerException_
>         at 
> org.drools.reteoo.RuleTerminalNode.retractTuple(_RuleTerminalNode.java:267_) 
>
>         at 
> org.drools.reteoo.SingleTupleSinkAdapter.propagateRetractTuple(_SingleTupleSinkAdapter.java:38_) 
>
>         at org.drools.reteoo.JoinNode.retractTuple(_JoinNode.java:217_)
>         at 
> org.drools.reteoo.SingleTupleSinkAdapter.propagateRetractTuple(_SingleTupleSinkAdapter.java:38_) 
>
>         at org.drools.reteoo.JoinNode.retractObject(_JoinNode.java:183_)
>         at 
> org.drools.reteoo.CompositeObjectSinkAdapter.propagateRetractObject(_CompositeObjectSinkAdapter.java:369_) 
>
>         at 
> org.drools.reteoo.ObjectTypeNode.retractObject(_ObjectTypeNode.java:189_)
>         at org.drools.reteoo.Rete.retractObject(_Rete.java:171_)
>         at 
> org.drools.reteoo.ReteooRuleBase.retractObject(_ReteooRuleBase.java:215_)
>         at 
> org.drools.reteoo.ReteooWorkingMemory.doRetract(_ReteooWorkingMemory.java:76_) 
>
>         at 
> org.drools.common.AbstractWorkingMemory.modifyObject(_AbstractWorkingMemory.java:940_) 
>
>         at 
> org.drools.base.DefaultKnowledgeHelper.modifyObject(_DefaultKnowledgeHelper.java:95_) 
>
>         at 
> drools.debug.Rule_Rule_4__Null_Pointer_Exception__0.consequence(_Rule_Rule_4__Null_Pointer_Exception__0.java:8_)
>
>         at 
> drools.debug.Rule_Rule_4__Null_Pointer_Exception__0ConsequenceInvoker.evaluate(_Rule_Rule_4__Null_Pointer_Exception__0ConsequenceInvoker.java:24_)
>
>         at 
> org.drools.common.DefaultAgenda.fireActivation(_DefaultAgenda.java:467_)
>         at 
> org.drools.common.DefaultAgenda.fireNextItem(_DefaultAgenda.java:431_)
>         at 
> org.drools.common.AbstractWorkingMemory.fireAllRules(_AbstractWorkingMemory.java:360_) 
>
>
> I have also encountered NPE in 
> "org.drools.reteoo.AlphaNode.retractObject" when using my actual rules 
> other than these simplifications put together to demonstrate the error 
> (both are caused by a call to "final Activation activation = 
> tuple.getActivation();" returning NULL so I suspect the root cause to 
> be common). Is this a case for a new JIRA entry or have I done 
> something idiotic?
>
> With kind regards,
>
> Mike
>
>------------------------------------------------------------------------
>
>_______________________________________________
>rules-users mailing list
>rules-users at lists.jboss.org
>https://lists.jboss.org/mailman/listinfo/rules-users
>  
>


-- 
 Edson Tirelli
 Software Engineer - JBoss Rules Core Developer
 Office: +55 11 3124-6000
 Mobile: +55 11 9218-4151
 JBoss, a division of Red Hat @ www.jboss.com





More information about the rules-users mailing list