4

起動時にプログラムでレポートを初期化するときに問題が発生しました。少し前までは、正しく動作していました。しかし、JDK 1.7 update 17 を JDK 1.7 update 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) は、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 から b27 バージョンの 1.6 にアップグレードしていました。

同じ問題が見つかったため、次のようにフォントを変更して修正しました。

iReport デザイナでは、フォント プロパティ (fontName および fontSize) を指定しない場合、どの要素に対してもデフォルトに設定されます。これが問題を引き起こしていることを願っています。

そのため、「各レポートのすべての要素のフォント プロパティ (特に fontName) を指定」して試しました。これで問題は解決しました。

予想される根本的な原因: 古いバージョンの jdk では、フォント マネージャーは、フォント プロパティが指定されていない要素の既定のプロパティを処理しています。最新バージョンでは、jdk がデフォルトのフォント プロパティを処理できない可能性があります。

于 2013-12-24T05:52:59.580 に答える