<br> Wolfgang is right, as usual. Also, if I am not mistaken, if you are using the MVEL you can use ? to prevent the NPE. Something like:<br><br>person?.name?.firstName<br><br> But this needs to be double checked. I never used it myself.<br>
<br> []s<br> Edson<br><br><div class="gmail_quote">2009/6/13 Wolfgang Laun <span dir="ltr"><<a href="mailto:wolfgang.laun@gmail.com">wolfgang.laun@gmail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
You have answered your question yourself: evaluation of patterns is<br>
done whenever a fact is added; salience will only order firings. Thus,<br>
the access person.name.firstName runs into the NPE.<br>
<br>
One way to cope with this would be to introduce a Name object which<br>
represents "no name", available as a public static object in Name; use<br>
this to initialize Person objects. This will still let you detect the<br>
absence of a name (name == Name.noName) but it won't run into the NPE<br>
in your second rule.<br>
<font color="#888888"><br>
-W<br>
</font><div><div></div><div class="h5"><br>
On 6/12/09, surya_n2007 <<a href="mailto:surya_n2007@yahoo.co.in">surya_n2007@yahoo.co.in</a>> wrote:<br>
><br>
> Throwing runtime exception in this example inserted person object as person<br>
> name is null. Ideally need to add error<br>
> "P01" and in second rule checks for precondition "P01" exist and skip rule.<br>
> But i am getting the below error.<br>
> Please let me know this is bug, i dont want to check again "Second Rule"<br>
> name object is not null.<br>
> I think this is happening since drools frist try to run all rules before<br>
> start execution.<br>
><br>
> please let me know whether anything wrong on my end.<br>
><br>
><br>
> Rule Engine COde :<br>
><br>
> Person person = test.new Person();<br>
> // Name name = person.new Name();<br>
> // person.setName(name);<br>
> workingMemory.insert(person);<br>
><br>
><br>
> rule "First Rule" salience 100 lock-on-active true<br>
> when<br>
> person : Person()<br>
> eval(<a href="http://person.name" target="_blank">person.name</a> == null)<br>
> then<br>
> person.errors.add("P01");<br>
> System.out.println("Rule 1 invoked"+person.errors);<br>
> update(person);<br>
> end<br>
><br>
> rule "Second Rule" salience 99 lock-on-active true<br>
> when<br>
> person : Person()<br>
> eval(!person.errors.contains("P01"))<br>
> eval(person.name.firstName=="Bob")<br>
> then<br>
> person.name.suffix="Mr";<br>
> System.out.println("Rule 2 invoked");<br>
> end<br>
><br>
><br>
><br>
><br>
> org.drools.RuntimeDroolsException:<br>
> com.sample.Rule_Second_Rule_0Eval1Invoker@4b42aa1e :<br>
> java.lang.NullPointerException<br>
> at org.drools.rule.EvalCondition.isAllowed(EvalCondition.java:82)<br>
> at<br>
> org.drools.reteoo.EvalConditionNode.assertTuple(EvalConditionNode.java:148)<br>
> at<br>
> org.drools.reteoo.SingleTupleSinkAdapter.propagateAssertTuple(SingleTupleSinkAdapter.java:29)<br>
> at<br>
> org.drools.reteoo.EvalConditionNode.assertTuple(EvalConditionNode.java:157)<br>
> at<br>
> org.drools.reteoo.CompositeTupleSinkAdapter.createAndPropagateAssertTuple(CompositeTupleSinkAdapter.java:73)<br>
> at<br>
> org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:116)<br>
> at<br>
> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:22)<br>
> at<br>
> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:162)<br>
> at org.drools.reteoo.Rete.assertObject(Rete.java:175)<br>
> at<br>
> org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:192)<br>
> at<br>
> org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java:71)<br>
> at<br>
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:911)<br>
> at<br>
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:883)<br>
> at<br>
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:684)<br>
> at com.sample.DroolsTest.main(DroolsTest.java:36)<br>
> Caused by: java.lang.NullPointerException<br>
> at com.sample.Rule_Second_Rule_0.eval1(Rule_Second_Rule_0.java:14)<br>
> at<br>
> com.sample.Rule_Second_Rule_0Eval1Invoker.evaluate(Rule_Second_Rule_0Eval1Invoker.java:20)<br>
> at org.drools.rule.EvalCondition.isAllowed(EvalCondition.java:77)<br>
> ... 14 more<br>
> --<br>
> View this message in context:<br>
> <a href="http://www.nabble.com/Throwing-runtimeException-4.0.7-not-supposed-tp24005070p24005070.html" target="_blank">http://www.nabble.com/Throwing-runtimeException-4.0.7-not-supposed-tp24005070p24005070.html</a><br>
> Sent from the drools - dev mailing list archive at Nabble.com.<br>
><br>
> _______________________________________________<br>
> rules-dev mailing list<br>
> <a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a><br>
> <a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
><br>
_______________________________________________<br>
rules-dev mailing list<br>
<a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br> Edson Tirelli<br> JBoss Drools Core Development<br> JBoss, a division of Red Hat @ <a href="http://www.jboss.com">www.jboss.com</a><br>