这几天使用了新版本jasperreport升级原有的报表系统,使原有的应用代码引发出一个错误:
[java] java.lang.NullPointerException
[java] at java.util.Hashtable.put(Hashtable.java:393)
[java] at net.sf.jasperreports.engine.fill.JRFillDataset.setParameterValues(JRFillDataset.java:558)
本问题解决,使用JasperFillManager.fillReport方法中Map参数应该使用HashMap不能使用Hashtable
[@more@]这几天使用了新版本jasperreport升级原有的报表系统,使原有的应用代码引发出一个错误:
[java] java.lang.NullPointerException
[java] at java.util.Hashtable.put(Hashtable.java:393)
[java] at net.sf.jasperreports.engine.fill.JRFillDataset.setParameterValues(JRFillDataset.java:558)
[java] at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:874)
[java] at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:689)
[java] at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:647)
[java] at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)
[java] at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:402)
[java] at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:188)
[java] at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:94)
......
追查发生空指针的代码为:
protected void setParameterValues(Map parameterValues) throws JRException
{
parameterValues.put(JRParameter.REPORT_PARAMETERS_MAP, parameterValues);
reportMaxCount = (Integer) parameterValues.get(JRParameter.REPORT_MAX_COUNT);
locale = (Locale) parameterValues.get(JRParameter.REPORT_LOCALE);
if (locale == null)
{
locale = Locale.getDefault();
parameterValues.put(JRParameter.REPORT_LOCALE, locale);
}
resourceBundle = (ResourceBundle) parameterValues.get(JRParameter.REPORT_RESOURCE_BUNDLE);
if (resourceBundle == null)
{
resourceBundle = loadResourceBundle();
parameterValues.put(JRParameter.REPORT_RESOURCE_BUNDLE, resourceBundle);//本行抛出空指针错误
}
parameterValues.put(JRParameter.REPORT_SCRIPTLET, scriptlet);
setFillParameterValues(parameterValues);
setDatasource();
}
郁闷,狂查为啥resourceBundle为空,无果,其默认值就是null
发现jasper里使用的parameterValues为java.util.HashMap类,而我的应用中传递的参数使用的是java.util.Hashtable类,由于jasperreport调用方法中使用的Map接口类型导致都可以使用,但是新版本中引入REPORT_RESOURCE_BUNDLE的参数无默认值,使得发生put空值,从而应用中不应该使用Hashtable,因为Hashtable不允许put空值;相反使用HashMap则不抛出错误。
所以本问题解决,将应用中的Hashtable统统改成HashMap。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/67736/viewspace-833767/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/67736/viewspace-833767/