[rules-users] Unexpected java.lang.NullPointerException at org.drools.core.util.RightTupleIndexHashTable.removeAdd(RightTupleIndexHashTable.java:353)

Wolfgang Laun wolfgang.laun at gmail.com
Tue Oct 23 06:55:07 EDT 2012


This may or may not be relevant (especially as this was working with
5.3.0) but a look at the RHS shows that the changes to a Subscenario
fact are done by setting two fields (step, sub_run) followed by a call
to update(act), which isn't wrong by itself. There is, however, an
insert of a new fact between the two changes. Making the rules engine
reconsider facts in WM while a fact is not in sync with the engine's
view must be considered an anti-pattern - it's dangerous.

-W


On 23/10/2012, Mark Proctor <mproctor at codehaus.org> wrote:
> You were not subscribed to the mailing list at the time, so this post did
> not
> make it through to the main list. If you could make a self contained unit
> test, we'll fix it asap. Follow details here:
> http://docs.jboss.org/drools/release/5.4.0.Final/droolsjbpm-introduction-docs/html/gettingstarted.html
>
> Take a look at MiscTest in drools-compiler to get an idea of how to write
> tests.
>
> Mark
>
>
> ru wrote
>> Dear drools-users and team!
>>
>> My working for years code cease to work after switching from Drools
>> 5.3.0Final to 5.4.0Final.
>>
>> Here is a rule of interest:
>> ..........................................................................
>> rule "Subscenario-Start"
>> 	dialect "java"
>> 	when
>> act: Subscenario( status == "START", $super_run: super_run, $run: run )
>> 	then
>> Scenario scenario = (Scenario) DroolsTab.mapInstance( act.sub_scenario );
>> scenario.run = new Integer ( runcount.intValue() + 1 );
>> scenario.super_run = $super_run;
>> scenario.caller = $run;
>> scenario.status = "START";
>> if ( traceLevel.intValue() > 0 )
>>   System.out.println( "STARTING SUB-SCENARIO "+scenario.title+"
>> "+scenario.run );
>> Map acm = contexToMap( act.context );
>> Map scm = contexToMap( scenario.context );
>> Map rmp = replace( act.ctxmap, acm );
>> scenario.ctxmap = replace( scm, rmp );
>> System.out.println( "1" );
>> if ( act.repeat != null )
>> {
>>   if ( act.step == null )
>>     act.step = new Integer( 0 );
>>   repeatStep( act, scenario.ctxmap, act.step.intValue() );
>> }
>> System.out.println( "2" );
>> insert( scenario );
>> System.out.println( "3 "+act.wait_subscenario );
>> if ( act.wait_subscenario != null && act.wait_subscenario.booleanValue()
>> )
>>   act.status = "REPEAT";
>> else
>>   act.status = "DONE";
>> System.out.println( "4 "+act.status );
>> act.sub_run = scenario.run;
>> update( act );
>> System.out.println( "5" );
>> DroolsTab.getWorkingMemory().setGlobal( "runcount", scenario.run );
>> System.out.println( "6" );
>> end
>> ..........................................................................
>>
>> Here is a trace (Please note: The first time it worked, and the second
>> gave an error):
>>
>> ..........................................................................
>> ru at ru-desktop ~ $ DroolsTabScene-5.2/run_protege.sh
>> WARNING: missing bundle: protege_text -- BundleHelper.
>> <init>
>> ()
>> Loaded 5000 instances: Scenario_ProjectKB_Class20011
>> OpenMap(tm) Version 5.0
>>   Copyright (C) BBNT Solutions LLC.  All rights reserved.
>>   See http://openmap.bbn.com/ for details.
>>
>> OpenMapTab scenario = ru.oogis.dro.DroolsTab evaluateScript "Run
>> Scenario"
>> Load time for file:/home/ru/DroolsTabScene-5.2/projects/Sea.pprj = 2 sec
>> (project) + 1 sec (ui)
>> DroTimer clock: ru.oogis.util.DroClock < second: 0 >
>> Run scenario: ru.oogis.dro.DroolsTab evaluateScript "Run Scenario"
>> FIRE: Start Scenario Command
>> FIRE: Scenario Null
>> STARTING SCENARIO s1.Collision 1
>> FIRE: Scenario Start
>> start TASK s1.Watch 1
>> FIRE: Task Start s1.Watch
>> start ACTION s1.Ports on Map 1
>> start ACTION s1.Wait Collision 1
>> FIRE: Interim Action Done s1.Ports on Map
>> start ACTION s1.Start Cruise from Primorsk 1
>> STARTING SUB-SCENARIO c1.Cruise from Primorsk 2
>> 1
>> 2
>> 3 false
>> 4 DONE
>> 5
>> 6
>> FIRE: Interim Action Done s1.Start Cruise from Primorsk
>> start ACTION s1.Cruise Shift 1
>> FIRE: Scenario Start
>> start TASK c1.Cruise from Primorsk 2
>> FIRE: Task Start c1.Cruise from Primorsk
>> start ACTION c1.Launch at Primorsk 2
>> FIRE: Interim Action Done c1.Launch at Primorsk
>> start ACTION c1.Mooring 2
>> FIRE: Retract Done Activity c1.Launch at Primorsk
>> FIRE: Retract Done Activity s1.Start Cruise from Primorsk
>> FIRE: Retract Done Activity s1.Ports on Map
>> FIRE: Interim Action Done c1.Mooring
>> start ACTION Cargo Loading Message 2
>> FIRE: Interim Action Done Cargo Loading Message
>> start ACTION c1.Cargo Loading 2 2
>> FIRE: Retract Done Activity Cargo Loading Message
>> FIRE: Retract Done Activity c1.Mooring
>> FIRE: Interim Action Done s1.Cruise Shift
>> start ACTION s1.Second Cruise 1
>> STARTING SUB-SCENARIO c1.Cruise to Primorsk 3
>> 1
>> 2
>> 3 true
>> 4 REPEAT
>> Exception in thread "AWT-EventQueue-0" Exception executing consequence
>> for
>> rule "Subscenario-Start" in ActionExecutor:
>> java.lang.NullPointerException
>> 	at
>> org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
>> 	at
>> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1283)
>> 	at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1209)
>> 	at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1442)
>> 	at
>> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710)
>> 	at
>> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674)
>> 	at
>> org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230)
>> 	at org.drools.runtime.rule.StatefulRuleSession$fireAllRules.call(Unknown
>> Source)
>> 	at DroTimer.repeat(Script1.groovy:25)
>> 	at ru.igis.omtab.RuNA.repeatSecondActions(RuNA.java:177)
>> 	at ru.igis.omtab.Clock.manageClock(Clock.java:82)
>> 	at ru.igis.omtab.Clock.actionPerformed(Clock.java:59)
>> 	at javax.swing.Timer.fireActionPerformed(Timer.java:313)
>> 	at javax.swing.Timer$DoPostEvent.run(Timer.java:244)
>> 	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
>> 	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:647)
>> 	at java.awt.EventQueue.access$000(EventQueue.java:96)
>> 	at java.awt.EventQueue$1.run(EventQueue.java:608)
>> 	at java.awt.EventQueue$1.run(EventQueue.java:606)
>> 	at java.security.AccessController.doPrivileged(Native Method)
>> 	at
>> java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
>> 	at java.awt.EventQueue.dispatchEvent(EventQueue.java:617)
>> 	at
>> java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
>> 	at
>> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
>> 	at
>> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
>> 	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
>> 	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
>> 	at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
>> Caused by: java.lang.NullPointerException
>> 	at
>> org.drools.core.util.RightTupleIndexHashTable.removeAdd(RightTupleIndexHashTable.java:353)
>> 	at org.drools.reteoo.JoinNode.modifyRightTuple(JoinNode.java:212)
>> 	at org.drools.reteoo.BetaNode.modifyObject(BetaNode.java:531)
>> 	at org.drools.reteoo.JoinNode.modifyObject(JoinNode.java:446)
>> 	at
>> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507)
>> 	at
>> org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432)
>> 	at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157)
>> 	at
>> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507)
>> 	at
>> org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:421)
>> 	at
>> org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314)
>> 	at
>> org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265)
>> 	at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:470)
>> 	at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:370)
>> 	at
>> org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:317)
>> 	at
>> org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:312)
>> 	at
>> ActionExecutor.Rule_Subscenario_Start_a83c5a15cccb436f8a66818ffd048e7c.defaultConsequence(Rule_Subscenario_Start_a83c5a15cccb436f8a66818ffd048e7c.java:34)
>> 	at
>> ActionExecutor.Rule_Subscenario_Start_a83c5a15cccb436f8a66818ffd048e7cDefaultConsequenceInvokerGenerated.evaluate(Unknown
>> Source)
>> 	at
>> ActionExecutor.Rule_Subscenario_Start_a83c5a15cccb436f8a66818ffd048e7cDefaultConsequenceInvoker.evaluate(Unknown
>> Source)
>> 	at
>> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1273)
>> 	... 26 more
>> ..........................................................................
>>
>> Any help would be greatly appreciated.
>> Sincerely,
>>    Ru
>
>
>
>
>
> --
> View this message in context:
> http://drools.46999.n3.nabble.com/Unexpected-java-lang-NullPointerException-at-org-drools-core-util-RightTupleIndexHashTable-removeAdd-tp4017906p4020431.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>


More information about the rules-users mailing list