<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
I am using Drools 4.0.3. I have a rule that I believe should work but
causes a NullPointerException at runtime.<br>
<br>
The rule phrased this way causes a NullPointerException:<br>
<font face="Courier New, Courier, monospace">rule "Create Order Limit"<br>
when<br>
CandleSeries( $instrument : instrumentSpecification ) <br>
then <br>
insert(new OrderConstraint( $instrument )); <br>
end</font><br>
<br>
While the same rule phased like this works fine:<br>
<br>
<font face="Courier New, Courier, monospace">rule "Create Order Limit"<br>
when<br>
$candle : CandleSeries( ) <br>
then <br>
insert(new OrderConstraint(
$candle.getInstrumentSpecification() )); <br>
end</font><br>
<br>
Is this right? I was looking at rule example 10.27 in the Drools guide
and it's written exactly like rule #1 is.<br>
<br>
Here is the full stack trace of the rule execution from version 1:<br>
<br>
j<font face="Courier New, Courier, monospace">ava.lang.NullPointerException<br>
at
org.activequant.core.domainmodel.TimeSeries.getInstrumentSpecification(Unknown
Source)<br>
at
org.drools.base.org.activequant.core.domainmodel.CandleSeries2216507$getInstrumentSpecification.getValue(Unknown
Source)<br>
at
org.drools.base.ClassFieldExtractor.getValue(ClassFieldExtractor.java:127)<br>
at org.drools.rule.Declaration.getValue(Declaration.java:197)<br>
at
sequitem.quanteq.ruleflow.Rule_Create_Order_Limit_0ConsequenceInvoker.evaluate(Rule_Create_Order_Limit_0ConsequenceInvoker.java:17)<br>
at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:550)<br>
at
org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:514)<br>
at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:462)<br>
at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:424)<br>
at
sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java:50)<br>
at
sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java:24)<br>
at
sequitem.quanteq.rules.RandomMarketEntryRulesTest.testRandomMarketEntryRules(RandomMarketEntryRulesTest.java:55)<br>
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br>
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br>
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br>
at java.lang.reflect.Method.invoke(Method.java:597)<br>
at junit.framework.TestCase.runTest(TestCase.java:168)<br>
at junit.framework.TestCase.runBare(TestCase.java:134)<br>
at junit.framework.TestResult$1.protect(TestResult.java:110)<br>
at junit.framework.TestResult.runProtected(TestResult.java:128)<br>
at junit.framework.TestResult.run(TestResult.java:113)<br>
at junit.framework.TestCase.run(TestCase.java:124)<br>
at junit.framework.TestSuite.runTest(TestSuite.java:232)<br>
at junit.framework.TestSuite.run(TestSuite.java:227)<br>
at junit.textui.TestRunner.doRun(TestRunner.java:116)<br>
at junit.textui.TestRunner.doRun(TestRunner.java:109)<br>
at junit.textui.TestRunner.run(TestRunner.java:77)<br>
at junit.textui.TestRunner.run(TestRunner.java:62)<br>
at
sequitem.quanteq.rules.RandomMarketEntryRulesTest.main(RandomMarketEntryRulesTest.java:63)<br>
E<br>
Time: 36.687<br>
There was 1 error:<br>
1)
testRandomMarketEntryRules(sequitem.quanteq.rules.RandomMarketEntryRulesTest)org.drools.spi.ConsequenceException:
java.lang.NullPointerException<br>
at
org.drools.base.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:14)<br>
at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:553)<br>
at
org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:514)<br>
at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:462)<br>
at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:424)<br>
at
sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java:50)<br>
at
sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java:24)<br>
at
sequitem.quanteq.rules.RandomMarketEntryRulesTest.testRandomMarketEntryRules(RandomMarketEntryRulesTest.java:55)<br>
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br>
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br>
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br>
at
sequitem.quanteq.rules.RandomMarketEntryRulesTest.main(RandomMarketEntryRulesTest.java:63)<br>
Caused by: java.lang.NullPointerException<br>
at
org.activequant.core.domainmodel.TimeSeries.getInstrumentSpecification(Unknown
Source)<br>
at
org.drools.base.org.activequant.core.domainmodel.CandleSeries2216507$getInstrumentSpecification.getValue(Unknown
Source)<br>
at
org.drools.base.ClassFieldExtractor.getValue(ClassFieldExtractor.java:127)<br>
at org.drools.rule.Declaration.getValue(Declaration.java:197)<br>
at
sequitem.quanteq.ruleflow.Rule_Create_Order_Limit_0ConsequenceInvoker.evaluate(Rule_Create_Order_Limit_0ConsequenceInvoker.java:17)<br>
at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:550)<br>
... 23 more</font><br>
</body>
</html>