4

我在启动时在程序中初始化报告时遇到问题。前段时间,它工作正常。但是当我将 JDK 1.7 更新 17 卸载到 JDK 1.7 更新 21 并全新安装 Netbeans 时,异常存在:(

这是错误消息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at sun.font.ExtendedTextSourceLabel.createCharinfo(ExtendedTextSourceLabel.java:609)
    at sun.font.ExtendedTextSourceLabel.getCharinfo(ExtendedTextSourceLabel.java:509)
    at sun.font.ExtendedTextSourceLabel.getLineBreakIndex(ExtendedTextSourceLabel.java:455)
    at java.awt.font.TextMeasurer.calcLineBreak(TextMeasurer.java:325)
    at java.awt.font.TextMeasurer.getLineBreakIndex(TextMeasurer.java:561)
    at java.awt.font.LineBreakMeasurer.nextOffset(LineBreakMeasurer.java:358)
    at net.sf.jasperreports.engine.fill.SimpleTextLineWrapper.measureExactLineBreakIndex(SimpleTextLineWrapper.java:561)
    at net.sf.jasperreports.engine.fill.SimpleTextLineWrapper.measureExactLine(SimpleTextLineWrapper.java:535)
    at net.sf.jasperreports.engine.fill.SimpleTextLineWrapper.nextLine(SimpleTextLineWrapper.java:517)
    at net.sf.jasperreports.engine.fill.TextMeasurer.renderNextLine(TextMeasurer.java:649)
    at net.sf.jasperreports.engine.fill.TextMeasurer.renderParagraph(TextMeasurer.java:454)
    at net.sf.jasperreports.engine.fill.TextMeasurer.measure(TextMeasurer.java:395)
    at net.sf.jasperreports.engine.fill.JRFillTextElement.chopTextElement(JRFillTextElement.java:541)
    at net.sf.jasperreports.engine.fill.JRFillTextField.prepare(JRFillTextField.java:641)
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:331)
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:379)
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:353)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillBandNoOverflow(JRVerticalFiller.java:458)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillPageHeader(JRVerticalFiller.java:421)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:282)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:151)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:822)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:61)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:276)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:745)
    at com.ikbiz.gastroscope.controller.ReportController.initReport(ReportController.java:180)
    at com.ikbiz.gastroscope.controller.ReportController.<init>(ReportController.java:111)
    at com.ikbiz.gastroscope.view.PanelScope.<init>(PanelScope.java:32)
    at com.ikbiz.gastroscope.view.PanelEntry.initComponents(PanelEntry.java:199)
    at com.ikbiz.gastroscope.view.PanelEntry.<init>(PanelEntry.java:86)
    at com.ikbiz.gastroscope.view.Application.initComponents(Application.java:203)
    at com.ikbiz.gastroscope.view.Application.<init>(Application.java:35)
    at com.ikbiz.gastroscope.view.Application.getInstance(Application.java:43)
    at com.ikbiz.gastroscope.view.Application.main(Application.java:79)
Java Result: 1

这是我初始化报告的代码。

public void initReport() {
        try {
            param.put("noMr", "0000");
            param.put("visitCode", "V-199208300000");
            param.put("templateLoco", iReportDir);
            param.put("tools", "Tools");
            param.put("medicine", "Medicine");
            param.put("result", "Data hasil disini");
            param.put("conclusion", "Data kesimpulan disini");
            param.put("suggestion", "Suggestion");
            param.put("SUBREPORT_DIR",iReportDir);

            String imageLoco = iReportDir +"image-sample.jpg";
            for (int i = 0; i < 20; i++) {        
                FileInputStream image = new FileInputStream(imageLoco);
                param.put("imgResult"+(i+1), image);
            }

            param.put("emptyImg", iReportDir+"logo.jpg");

            setTemplate("data/reports/templates/template_1.jasper");

            jasperPrint = JasperFillManager.fillReport(getTemplate(), param, DatabaseUtility.getConnection());
        } catch (JRException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ioe) {
            System.out.println(ioe.getMessage());
        }
    }

但是,当我构建到。罐子,错误消失了。

请帮忙,谢谢之前:)

4

3 回答 3

4

您使用的是 Calibri 字体吗?我发现这是一个 jdk 1.7.0_21 错误,似乎特定于 Calibri。尝试将字体切换为 Arial,错误应该会消失。

如果您有很多报告和子报告要修改,这可能会有所帮助:

find . *.jrxml -type f -print0 |xargs -0 grep -lZ "Calibri" |xargs -0 sed -i 's/Calibri/Arial/g' 

我有一个应用程序也调用了相同的 JasperFillManager 方法,我可以确认我在 jdk 1.7_0_21 中看到了相同的堆栈跟踪。如果我将 jdk 更改为 1.7_0_17 或 1.7_0_07,则不会发生错误。该类在 rt.jar 中,据我所知,源不可用。但是 1.7 是基于 openjdk 的,可以在jdk7src找到非常相似的源代码。

调试应用程序,我可以看到 createCharinfo 获取一个 StandardGlyphVector 对象并查询它以获取字形的数量,它返回 0。 StandardGlyphVector.getGlyphCharIndices(0,0,null) 然后返回一个非空但为空的数组。sun.font.ExtendedTextSourceLabel 代码不检查 null 或空数组返回情况,并尝试访问正确抛出 AIOOBE 的数组。

这里似乎有一个相关的错误报告。

于 2013-05-14T16:38:55.413 回答
3

我也遇到了这个问题并对此进行了更多测试。以下是简短的调查结果,但我也对OTN 线程发表了评论。

  • 受 1.6.0u45 和 1.7.0u21 Windows JVM 的影响
  • 仅受 Calibri、Calibri Bold、Calibri Bold Italic、Calibri Italic 和 Cambria Bold 字体影响
  • 最有可能在非公开 1.6.0u51 中修复
  • 在 1.7.0u25 中修复
于 2013-07-24T04:32:09.013 回答
0

我们正在将我们的 jdk 从 b24 升级到 1.6 的 b27 版本。

当我们发现同样的问题时,我们通过字体更改来修复它,如下所示:

在 iReport 设计器中,对于任何没有指定字体属性(fontName 和 fontSize)的元素,它将被设置为默认值。希望这是给问题。

因此,我们“为每个报告中的每个元素指定了字体属性(尤其是 fontName)”并进行了尝试。这解决了这个问题。

根本原因符合预期:在旧版本的 jdk 中,字体管理器正在处理未指定字体属性的元素的默认属性。在最新版本中,可能是 jdk 无法处理默认字体属性。

于 2013-12-24T05:52:59.580 回答