Прервать создание отчета Jasper на NullPointerException - PullRequest
0 голосов
/ 29 марта 2011

Я создаю отчеты с помощью 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>

1 Ответ

0 голосов
/ 08 апреля 2011

Это не похоже на проблему с выражением нулевого указателя. Похоже, ваш источник данных допускает пустые поля. JasperReports достаточно надежен для обработки отчета, в котором отсутствует некоторая информация. Существует свойство, которое вы можете установить, чтобы при отсутствии информации поле выводило «null» или оставалось пустым. Если вы вообще не хотите, чтобы отчет генерировался, если поле данных имеет значение NULL, измените источник данных так, чтобы поля были «не NULL».

В качестве альтернативы, добавьте условный оператор, чтобы ваш скриптлет выполнялся только в том случае, если поля th не равны NULL, и прерывался, если они есть. Затем, когда отчет достигнет нулевого поля, он остановится.

...