Drools java.lang.NullPointerException at org.drools.reteoo.RuleTerminalNode any idea

Alberto Rugnone Source

As usual in these days I am working hard on drools. Honestly I have a lot of difficulties and I am a little bi discouraged. Now I have this problem. My application has to monitor when a magnetic contact is activated and when it is contact released event has to be retracted. And viceversa. Here is my rule and the big null pointer I have. Any helps will be very appreciated! Thank you a lot!!

 rule "contact activated vs contact released"   salience 0 no-loop true
    when
        $contact_activated : Event(type == EventType.CONTACT_ACTIVATED) ||  

    $contact_released : Event(type == EventType.CONTACT_RELEASED)
        then

             if($contact_activated!= null) {
                retract($contact_activated);
             } else {
                retract($contact_released);
             }
end 

and I have

java.lang.NullPointerException
    at org.drools.reteoo.RuleTerminalNode$SortDeclarations.compare(RuleTerminalNode.java:477)
    at org.drools.reteoo.RuleTerminalNode$SortDeclarations.compare(RuleTerminalNode.java:473)
    at java.util.Arrays.mergeSort(Arrays.java:1270)
    at java.util.Arrays.sort(Arrays.java:1210)
    at org.drools.reteoo.RuleTerminalNode.<init>(RuleTerminalNode.java:119)
    at org.drools.RuleActivationListenerFactory.createActivationListener(RuleActivationListenerFactory.java:21)
    at org.drools.reteoo.builder.ReteooRuleBuilder.addSubRule(ReteooRuleBuilder.java:157)
    at org.drools.reteoo.builder.ReteooRuleBuilder.addRule(ReteooRuleBuilder.java:123)
    at org.drools.reteoo.ReteooBuilder.addRule(ReteooBuilder.java:110)
    at org.drools.reteoo.ReteooRuleBase.addRule(ReteooRuleBase.java:441)
    at org.drools.common.AbstractRuleBase.addRule(AbstractRuleBase.java:821)
    at org.drools.common.AbstractRuleBase.addPackages(AbstractRuleBase.java:555)
    at org.drools.reteoo.ReteooRuleBase.addPackages(ReteooRuleBase.java:458)
    at org.drools.impl.KnowledgeBaseImpl.addKnowledgePackages(KnowledgeBaseImpl.java:150)
    at it.ipiu.pch.sel.RuleTest.before(RuleTest.java:1272)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
jbossdroolsrule-engine

Answers

answered 6 years ago Edson Tirelli #1

This looks like a bug, I suggest you submit a JIRA to the project. Which version are you using?

At the same time, your rule is more complicated than it should. Every time you see an "if" in the consequence, it is a red flag something is not good. You can rewrite your rule as:

rule "contact activated vs contact released"
when
    $contact : Event( type in ( EventType.CONTACT_ACTIVATED, EventType.CONTACT_RELEASED ) )
then
    retract($contact);
end 

comments powered by Disqus