2011-03-28 2 views
0

Je crée des rapports avec Jasper Reports (4.0.0) pour notre projet (JRE 1.6.x).Annulation de génération de rapport Jasper sur NullPointerException

Je suis dérangé par NullPointerException s dans mes scriptlets, car ils n'entraînent pas l'abandon du rapport, ils font simplement évaluer le champ en null. Pour autant que j'ai testé, il arrive seulement aux NPE.

Les rapports générés sont assez importants et ne devraient contenir aucune erreur. Donc, si une exception se produit (comme NPE pour certaines données manquantes), il devrait arrêter la génération, et la base de données et/ou le rapport devrait être corrigé. Un tel comportement peut masquer certaines erreurs de codage de rapport, à moins que quelqu'un ne repère le champ manquant.

Quelle est la raison de ce comportement avec NPE? Existe-t-il une option de compilation ou un indicateur d'exécution que je peux changer pour faire monter la bulle de NPE comme d'autres exceptions? Je souhaite vraiment que je n'aurai pas à emballer toutes les méthodes scriptlet dans un bloc try..catch et de jeter une autre exception sur NPE.

Merci!


Ok, un exemple de rapport. Il n'utilise pas scriptlets, mais génère les NPE directement sur une évaluation sur le terrain (le résultat est le même), et peut être exécuté directement sur l'aperçu iReport sans paramètres:

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="NPE_Report" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> 
    <property name="ireport.zoom" value="1.0"/> 
    <property name="ireport.x" value="0"/> 
    <property name="ireport.y" value="0"/> 
    <variable name="NullVariable" class="java.lang.Integer" calculation="System"> 
     <initialValueExpression><![CDATA[null]]></initialValueExpression> 
    </variable> 
    <variable name="NotNullVariable" class="java.lang.Integer" calculation="System"> 
     <initialValueExpression><![CDATA[200]]></initialValueExpression> 
    </variable> 
    <title> 
     <band height="72" splitType="Stretch"> 
      <staticText> 
       <reportElement x="11" y="10" width="179" height="22"/> 
       <textElement> 
        <font size="14"/> 
       </textElement> 
       <text><![CDATA[Successful field evaluation:]]></text> 
      </staticText> 
      <textField> 
       <reportElement x="190" y="10" width="296" height="22"/> 
       <textElement> 
        <font size="14"/> 
       </textElement> 
       <textFieldExpression class="java.lang.String"><![CDATA["0x"+Integer.toHexString($V{NotNullVariable}.intValue()+55)]]></textFieldExpression> 
      </textField> 
      <staticText> 
       <reportElement x="11" y="32" width="179" height="22"/> 
       <textElement> 
        <font size="14"/> 
       </textElement> 
       <text><![CDATA[NPE on field evaluation:]]></text> 
      </staticText> 
      <textField> 
       <reportElement x="190" y="32" width="296" height="22"/> 
       <textElement> 
        <font size="14"/> 
       </textElement> 
       <textFieldExpression class="java.lang.String"><![CDATA["0x"+Integer.toHexString($V{NullVariable}.intValue()+55)]]></textFieldExpression> 
      </textField> 
     </band> 
    </title> 
    <detail> 
     <band height="24" splitType="Stretch"/> 
    </detail> 
</jasperReport> 
+0

Partagez du code. –

+0

@Dave Jarvis code ajouté – mdrg

Répondre

0

Il ne ressemble pas à un pointeur NULL problème d'expression. Il semble que votre source de données autorise les champs null. JasperReports est suffisamment robuste pour gérer un rapport contenant des informations manquantes. Il existe une propriété que vous pouvez définir de sorte que lorsque des informations sont manquantes, le champ affiche "null" ou est laissé vide. Si vous ne voulez pas que le rapport génère du tout si le champ de données est null, modifiez votre source de données afin que les champs ne soient pas "null". Sinon, laissez tomber sur une instruction conditionnelle de sorte que votre scriptlet ne s'exécute que si les champs ne sont pas NULL et cassez s'ils le sont. Ensuite, lorsque le rapport atteint un champ nul, il s'arrête.

Questions connexes