But isn&#39;t the java.lang.runtimeException thrown up to the point where you<div>call fireAllrules() in your RulesEngine.java at line 318? Just catching NPE</div><div>is a little dodgy since you can&#39;t know what might happen.</div>
<div>-W<br><br><div class="gmail_quote">On 28 March 2012 18:35, scottleff <span dir="ltr">&lt;<a href="mailto:scott.leff@fbfs.com">scott.leff@fbfs.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
During development of our Drools rule base I had a case where a rule compiled<br>
fine, but at runtime a NPE is thrown by MVEL when applying the predicate<br>
(LHS) because the Coverage.vehicleSupplement attribute was NULL.  I had<br>
expected the NPE to be returned to my calling java program so that my<br>
try/catch could address the issue.  However, the exception was sent to<br>
System.err and the rule was simply skipped.  First, is the the default<br>
behavior in Drools for Exceptions thrown from the LHS?  If so, can it be<br>
overridden to actually return the exception?<br>
<br>
rule &quot;BR--UM Stacked Coverage&quot;<br>
        agenda-group &quot;BR_Change&quot;<br>
        dialect &quot;mvel&quot;<br>
        when<br>
                coverage : Coverage( vehicleSupplement.stackable == true , coverageCode ==<br>
&quot;UDCSL&quot;)<br>
                vehicle : Vehicle( unitAtRiskNumber : unitAtRiskNumber)<br>
                Policy( state == &quot;NM&quot; )<br>
        then<br>
                WorkItemReason fact0 = new WorkItemReason();<br>
                fact0.setType( &quot;Policy&quot; );<br>
                fact0.setReason( &quot;6408: UM/UDM stacking change&quot; );<br>
                fact0.setAddBookmark( &quot;VE&quot; );<br>
                fact0.setAddBookmarkUnit( unitAtRiskNumber );<br>
                insertLogical(fact0 );<br>
end<br>
<br>
*Here is the stacktrace from my console:*<br>
WARNING: java.lang.RuntimeException: cannot invoke getter:<br>
getVehicleSupplement [declr.class: com.fbfs.pc.ecd.model.Coverage;<br>
act.class: com.fbfs.pc.ecd.model.Coverage] (see trace)<br>
        at<br>
org.mvel2.optimizers.impl.refl.nodes.GetterAccessor.getValue(GetterAccessor.java:74)<br>
        at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:106)<br>
        at org.mvel2.MVELRuntime.execute(MVELRuntime.java:87)<br>
        at<br>
org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:122)<br>
        at org.mvel2.MVEL.executeExpression(MVEL.java:954)<br>
        at<br>
org.drools.base.extractors.MVELClassFieldReader.getValue(MVELClassFieldReader.java:100)<br>
        at<br>
org.drools.base.extractors.BaseObjectClassFieldReader.isNullValue(BaseObjectClassFieldReader.java:179)<br>
        at<br>
org.drools.base.evaluators.EqualityEvaluatorsDefinition$BooleanEqualEvaluator.evaluate(EqualityEvaluatorsDefinition.java:555)<br>
        at org.drools.rule.LiteralRestriction.isAllowed(LiteralRestriction.java:87)<br>
        at org.drools.rule.LiteralConstraint.isAllowed(LiteralConstraint.java:109)<br>
        at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:130)<br>
        at<br>
org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:458)<br>
        at<br>
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:386)<br>
        at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:215)<br>
        at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:244)<br>
        at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:330)<br>
        at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:291)<br>
        at<br>
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:886)<br>
        at<br>
org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:180)<br>
        at<br>
org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:174)<br>
        at<br>
PolicyDefinitionRules.Rule_policyDefinition_UnitAtRiskCoverage.defaultConsequence(Rule_policyDefinition_UnitAtRiskCoverage.java:8)<br>
        at<br>
PolicyDefinitionRules.Rule_policyDefinition_UnitAtRiskCoverageDefaultConsequenceInvoker.evaluate(Unknown<br>
Source)<br>
        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1091)<br>
        at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1029)<br>
        at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1251)<br>
        at<br>
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:708)<br>
        at<br>
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:672)<br>
        at<br>
org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:218)<br>
        at<br>
com.fbfs.pc.rulesengine.controller.RulesEngine.runRulesEngine(RulesEngine.java:318)<br>
<br>
<br>
My expectation that Exceptions thrown from the consequence (RHS) are<br>
returned to the calling program was confirmed when I added the following 2<br>
lines to a rule that was not experiencing the above issue:<br>
     String myString = null;<br>
     System.out.println(myString.trim());<br>
<br>
Is there any good documentation on Drools exception handling?<br>
Current configuration is Drools 5.3.0, MVEL 2.1.0, Glassfish 2.1<br>
<br>
--<br>
View this message in context: <a href="http://drools.46999.n3.nabble.com/NPE-from-LHS-of-rule-is-not-returned-by-Drools-to-calling-program-tp3865110p3865110.html" target="_blank">http://drools.46999.n3.nabble.com/NPE-from-LHS-of-rule-is-not-returned-by-Drools-to-calling-program-tp3865110p3865110.html</a><br>

Sent from the Drools: User forum mailing list archive at Nabble.com.<br>
_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</blockquote></div><br></div>