2013-05-02 17 views
4

我在啓動時初始化程序中的報告時遇到問題。 前段時間,它工作正常。但是,當我反安裝JDK 1.7更新17到JDK 1.7更新21,和新鮮的安裝NetBeans,異常存在:(在開發模式下生成JasperReport時出錯

這是錯誤消息:

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

您是否使用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代碼不檢查空或空數組的返回情況,並嘗試訪問正確引發AIOOBE的數組。

似乎有一個相關的錯誤報告here

+0

是的,我有自定義模塊,允許用戶自定義報告的字體並附加Calibri字體進行自定義。 我檢查,默認字體是'Calibri'。 所以我把它改爲'Arial'錯誤消失了! :D以前感謝。 – 2013-05-17 04:21:07

+0

非常感謝!自上週以來,我一直不知道發生了什麼。 – romaintaz 2014-02-10 11:51:58

+0

一年多以後。那find | grep | sed模式仍然是黃金。 – Ryan 2014-07-18 21:14:46

3

我也遇到過這個問題,並完成a bit more testing on this。簡而言之,這些發現,但我也評論了OTN thread

  • 由1.6.0u45和1.7.0u21的Windows的JVM
  • 僅實行由宋體,宋體加粗,宋體加粗傾斜,宋體斜體和坎布里亞粗體字體
  • 最有可能固定在非影響公共1.6.0u51
  • 固定在1.7.0u25
0

我們從B24到B27 1.6版本升級,我們的JDK。

當我們發現了同樣的問題,我們得到了它被固定字體變化如下:

在iReport的設計師,對於任何元素,如果我們不指定字體屬性(的fontName和fontSize的),這將是設置爲默認值。 希望這是給問題。

因此,我們「爲每個報告中的每個元素指定了字體屬性(特別是fontName)」並嘗試使用。 這解決了這個問題。

根本原因如預期: 在早期版本的jdk中,字體管理器正在處理未指定font屬性的元素的默認屬性。 在最新版本中,可能是jdk無法處理默認的字體屬性。

相關問題