Я создаю отчеты с помощью Jasper Reports (4.0.0) для нашего проекта (JRE 1.6.x).
Меня беспокоит NullPointerException
s в моих скриплетах, поскольку они этого не делаютчтобы прервать отчет, они просто молча оценивают поле как null
.Насколько я тестировал, это происходит только с NPE.
Сгенерированные отчеты очень важны и не должны иметь ошибок.Таким образом, если возникает исключение (например, NPE для некоторых отсутствующих данных), оно должно остановить генерацию, и база данных и / или отчет должны быть исправлены.Такое поведение может скрывать некоторые ошибки кодирования отчетов, если только кто-то не обнаружит пропущенное поле.
В чем причина такого поведения с NPE?Есть ли какой-либо параметр компиляции или флаг выполнения, который я могу переключить, чтобы пузырь пузыря NPE всплыл, как это делают другие исключения?Мне бы очень хотелось, чтобы мне не пришлось оборачивать каждый метод скриптлета в блоке try..catch
и выдавать другое исключение в NPE.
Спасибо!
Хорошо, пример отчета.Он не использует скриптлеты, но генерирует NPE непосредственно на оценке поля (результат тот же) и может быть выполнен непосредственно в предварительном просмотре iReport без параметров:
<?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>