eclipse插件FindBugs使用笔记

mac2022-06-30  104

FindBugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种 Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,23种Performance,43种Dodgy。 Bad practice 坏的实践 一些不好的实践,下面列举几个: HE: 类定义了equals(),却没有hashCode();或类定义了equals(),却使用 Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode()。 SQL:Statement 的execute方法调用了非常量的字符串;或Prepared Statement是由一个非常量的字符串产生。 DE: 方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。 Correctness 一般的正确性问题 可能导致错误的代码,下面列举几个: NP: 空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。 Nm: 类定义了hashcode()方法,但实际上并未覆盖父类Object的hashCode();类定义了tostring()方法,但实际上并未覆盖父类Object的toString();很明显的方法和构造器混淆;方法名容易混淆。 SQL:方法尝试访问一个Prepared Statement的0索引;方法尝试访问一个ResultSet的0索引。 UwF:所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。 Internationalization 国际化 当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。 Malicious code vulnerability 可能受到的恶意攻击 如果代码公开,可能受到恶意攻击的代码,下面列举几个: FI: 一个类的finalize()应该是protected,而不是public的。 MS:属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。 Multithreaded correctness 多线程的正确性 多线程编程时,可能导致错误的代码,下面列举几个: ESync:空的同步块,很难被正确使用。 MWN:错误使用notify(),可能导致IllegalMonitorStateException异常;或错误的 使用wait()。 No: 使用notify()而不是notifyAll(),只是唤醒一个线程而不是所有等待的线程。 SC: 构造器调用了Thread.start(),当该类被继承可能会导致错误。 Performance 性能问题 可能导致性能不佳的代码,下面列举几个: DM:方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似 Integer.toString(1) 代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。 SIC:如果一个内部类想在更广泛的地方被引用,它应该声明为static。 SS: 如果一个实例属性不被读取,考虑声明为static。 UrF:如果一个属性从没有被read,考虑从类中去掉。 UuF:如果一个属性从没有被使用,考虑从类中去掉。 Dodgy 危险的 具有潜在危险的代码,可能运行期产生错误,下面列举几个: CI: 类声明为final但声明了protected的属性。 DLS:对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。 ICAST: 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。 INT:没必要的整型数字比较,如X <= Integer.MAX_VALUE。 NP: 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。 REC:直接捕获Exception,而实际上可能是RuntimeException。 ST: 从实例方法里直接修改类变量,即static属性。  以下是我使用FindBugs插件对我们现有项目进行的代码审查和优化: 1、文件路径:com/iamzken/test/DepartmentInfo.java 行数:1245行 修正之前代码片段:     public synchronized boolean equals(java.lang.Object obj) {         if (!(obj instanceof DepartmentInfo)) returnfalse;         DepartmentInfo other = (DepartmentInfo)obj;         if (obj == null) returnfalse;         if (this == obj) returntrue;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 修正之后代码片段:        public synchronized booleanequals(java.lang.Object obj) {         if (!(obj instanceof DepartmentInfo)) returnfalse;         DepartmentInfo other = (DepartmentInfo)obj;         //if (obj == null) returnfalse;         if (this == obj) returntrue;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 改动原因:把if (obj == null)returnfalse;去掉,因为如果代码走到该处的话,obj肯定不会为空!    2、 文件路径:com/iamzken/test/JobInfo.java 行数:861行 修正之前代码片段:     public synchronized booleanequals(java.lang.Object obj) {         if (!(obj instanceof JobInfo)) returnfalse;         JobInfo other = (JobInfo) obj;         if (obj == null) returnfalse;         if (this == obj) returntrue;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 修正之后代码片段:       public synchronized booleanequals(java.lang.Object obj) {         if (!(obj instanceof JobInfo)) returnfalse;         JobInfo other = (JobInfo) obj;         //if (obj == null) returnfalse;         if (this == obj) returntrue;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 改动原因:把if (obj == null)returnfalse;这句话去掉,因为代码执行到此处,obj肯定不会为null;     3、  文件路径:com/iamzken/test/PersonInfo.java 行数:957 修正之前代码片段:      public synchronized booleanequals(java.lang.Object obj) {         if (!(obj instanceof PersonInfo)) return false;         PersonInfo other = (PersonInfo) obj;         if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        }   修正之后代码片段:   public synchronized boolean equals(java.lang.Object obj) {         //if (!(obj instanceof PersonInfo)) return false;         PersonInfo other = (PersonInfo) obj;         if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 改动原因:把if (!(obj instanceof PersonInfo)) return false;这句话去掉,因为代码执行到此处,obj肯定不会为null;   4、 文件路径: org/iamzken/test/AccidentScrapModel.java 行数:117 修正之前代码片段: public synchronized boolean equals(java.lang.Object obj) {         if (!(obj instanceof AccidentScrapModel)) return false;         AccidentScrapModel other =(AccidentScrapModel) obj;         if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 修正之后代码片段: public synchronized boolean equals(java.lang.Object obj) {         if (!(obj instanceof AccidentScrapModel)) return false;         AccidentScrapModel other =(AccidentScrapModel) obj;        // if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 改动原因:把if (obj == null)return false;这句代码去掉,因为代码执行到此处,obj肯定不会为空。    5、 文件路径: org/iamzken/test/ApprovalRecordModel.java 行数:165 修正之前代码片段:      public synchronized booleanequals(java.lang.Object obj) {         if (!(obj instanceof ApprovalRecordModel)) return false;         ApprovalRecordModel other =(ApprovalRecordModel) obj;         if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 修正之后代码片段:     public synchronized booleanequals(java.lang.Object obj) {         if (!(obj instanceof ApprovalRecordModel)) return false;         ApprovalRecordModel other =(ApprovalRecordModel) obj;         //if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 改动原因: 把if (obj == null)return false;这句话去掉,因为代码执行到此处,obj肯定不会为空   6、 文件路径: org/iamzken/test/CompositeType.java 行数:69 修正之前代码片段:   public synchronized boolean equals(java.lang.Object obj) {         if (!(obj instanceof CompositeType)) return false;         CompositeType other = (CompositeType)obj;         if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 修正之后代码片段:   public synchronized boolean equals(java.lang.Object obj) {         if (!(obj instanceof CompositeType)) return false;         CompositeType other = (CompositeType)obj;         //if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 改动原因: 把if (obj == null)return false;这句话去掉,因为代码执行到此处,obj肯定不会为空。   7、 文件路径: org/iamzken/test/WFProcessStatusModel.java 行数:117 修正之前代码: public synchronized boolean equals(java.lang.Object obj) {         if (!(obj instanceof WFProcessStatusModel)) return false;         WFProcessStatusModel other =(WFProcessStatusModel) obj;         if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 修正之后代码: public synchronized boolean equals(java.lang.Object obj) {         if (!(obj instanceof WFProcessStatusModel)) return false;         WFProcessStatusModel other =(WFProcessStatusModel) obj;         //if (obj == null) return false;         if (this == obj) return true;         if (__equalsCalc != null) {             return (__equalsCalc == obj);        } 改动原因: 把if (obj == null)return false;这句代码去掉,因为代码执行到此处,obj肯定不会为空。   8、  文件路径: com/iamzken/google/TradeCalcController.java 行数:216 修正之前代码片段: if(! "4".equals(recountLog.getTypeId())){                  processService.processData();              }                   } 修正之后代码片段: if(! (4==recountLog.getTypeId())){                        processService.processData();             } 改动原因: recountLog.getTypeId()返回的值是Integer,可以直接通过==进行比较,没必要把4包装成字符串进行equals比较,因为需要对字符串进行解析,降低效率    9、  文件路径: com/iamzken/google/PaymentSetController.java 行数:307 改动之前代码片段: if("".equals(tranCycle)||tranCycle==null||tranCycle==""){                                        flag="1"; 改动之后代码片段:     if("".equals(tranCycle)||tranCycle==null){                flag="1"; 改动原因: 去掉||tranCycle==""   10、 文件路径: com/iamzken/google/PartnersWebServiceImpl.java 行数:353 改动之前代码片段: if(partnersmodel.length<0){                             errMsg ="账单信息为空!";                    } 改动之后代码片段:      if(partnersmodel.length<=0){            errMsg ="账单信息为空!";        } 改动原因:<改为<=   11、 文件路径: com/iamzken/google/PartnersWebServiceImpl.java 行数:226 改动之前代码片段: if(partnersmodel.length<0){            errMsg =errMsg+"账单信息为空!";        } 改动之后代码片段: if(partnersmodel.length<=0){            errMsg =errMsg+"账单信息为空!";        } 改动原因:<改为<=   12、文件路径: com/iamzken/google/PaymentSetController.java 行数:163 修改之前代码片段: if(!"".equals(id)&& id != null && id != ""){                                                 this.paymentSetService.insertPaymentSetItem(paymentset);                                                  jm.setStatus(JsonModel.STATUS_OK);                                                  jm.setMsg("修改成功!"); 修改之后代码片段: if(!"".equals(id) && id != null){                     this.paymentSetService.insertPaymentSetItem(paymentset);                    jm.setStatus(JsonModel.STATUS_OK);                     jm.setMsg("修改成功!"); 改动原因:去掉&& id != ""   13、文件路径: com/iamzken/google/PaymentSetController.java 行数:176 修改之前代码片段: if(!"".equals(id)&& id != null && id != ""){                                                  jm.setMsg("提交失败!"); 修改之后代码片段: if(!"".equals(id) && id != null){                     jm.setMsg("提交失败!");  改动原因:去掉&& id != ""   14、文件路径:com/iamzken/MenuDataService.java 行数:362 修改之前代码片段: }finally{                             try {                                      fw.close();                             } catch (IOExceptione) {                                      e.printStackTrace();                             }                    } 修改之后代码片段: }finally{            try {               if(fw != null){                   fw.close();               }            } catch (IOException e) {               e.printStackTrace();            } 改动原因:fw关闭之前加上判空代码,否则有可能出现空指针异常。   15、文件路径:com/iamzken/test/LoginController.java 行数:101-102 修改之前代码片段: mv.addObject("dfUrl",cmd.getDefaultUrl());                    mv.addObject("userName",cmd.getUserName()); 修改之后代码片段:     if(cmd != null){            mv.addObject("dfUrl", cmd.getDefaultUrl());            mv.addObject("userName", cmd.getUserName());        } 改动原因:使用cmd对象之前先要进行非空判断   16、 文件路径: com/iamzken/google/AgentInfo.java 行数:110-114 修改之前代码片段: public boolean equals(AgentInfo agentInfo){     if(agentName.equals(agentInfo.getAgentName()) )          {            return true;          }   修改之后代码片段: public boolean equals(AgentInfo obj){          if(obj instanceof AgentInfo){                             AgentInfo agentInfo= (AgentInfo)obj;                             if(agentName.equals(agentInfo.getAgentName()))                              {                                       returntrue;                              }                     }   并且要重写hashCode方法。 @Override     public int hashCode(){        return this.getAgentName().hashCode();     } 改动原因:这是equals方法的标准写法。   17、文件路径: com/iamzken/google/MerchantsTransfer.java 行数:88-98 修改之前代码片段:     public boolean equals(MerchantsTransfer merchantsTransfer){          if(this.merchantName.equals(merchantsTransfer.getMerchantName())             &&this.formerAgentName.equals(merchantsTransfer.getFormerAgentName())             && this.idcontent.equals(merchantsTransfer.getIdcontent())             && this.acceptAgentName.equals(merchantsTransfer.getAcceptAgentName())             )          {            return true;          }           return false;       }  修改之后代码片段: public booleanequals(Object obj){                    if(obj instanceofMerchantsTransfer){                             MerchantsTransfermerchantsTransfer = (MerchantsTransfer)obj;                             if(this.merchantName.equals(merchantsTransfer.getMerchantName())                                                &&this.formerAgentName.equals(merchantsTransfer.getFormerAgentName())                                                &&this.idcontent.equals(merchantsTransfer.getIdcontent())                                                &&this.acceptAgentName.equals(merchantsTransfer.getAcceptAgentName())                             )                              {                                       returntrue;                              }                     }             return false;            }             @Override          public int hashCode() {                    returnthis.getMerchantName().hashCode()+                                      this.getFormerAgentName().hashCode()+                                      this.getIdcontent().hashCode()+                                      this.getAcceptAgentName().hashCode();                                               }   改动原因:equals方法写的不是标准写法,并且只有equals方法没有hashCode方法    18、文件路径: com/iamzken/google/SpecialMerchantInfo.java 行数:55-64 修改之前代码片段:      public boolean equals(SpecialMerchantInfo merchantInfo){          if(specialMerchantName.equals(merchantInfo.getSpecialMerchantName())             && membercode.equals(merchantInfo.getMembercode())             && agentName.equals(merchantInfo.getAgentName())             )          {            return true;          }          return false;       }   修改之后代码片段:      public boolean equals(Object obj){        if(obj instanceof SpecialMerchantInfo){            SpecialMerchantInfo merchantInfo =(SpecialMerchantInfo)obj;            if(specialMerchantName.equals(merchantInfo.getSpecialMerchantName())                   && membercode.equals(merchantInfo.getMembercode())                   && agentName.equals(merchantInfo.getAgentName())            )             {                return true;             }         }         return false;       }          @Override     public int hashCode() {        return this.getSpecialMerchantName().hashCode()+               this.getMembercode().hashCode()+               this.getAgentName().hashCode();     }    改动原因: equals方法不是标准写法,并且没有hashCode方法。   19、文件路径: com/iamzken/google/SpringContextsUtil.java 行数:整个文件 修改之前的代码: package com.iamzken.google;   import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware;   public class SpringContextsUtilimplements ApplicationContextAware {       private static ApplicationContext applicationContext;       public static Object getBean(StringbeanName) {         return applicationContext.getBean(beanName);     }       public static <T> T getBean(StringbeanName, Class<T> clazs) {         return clazs.cast(getBean(beanName));     }       public void setApplicationContext(ApplicationContextapplicationContext)             throws BeansException {         SpringContextsUtil.applicationContext = applicationContext;     } }   修改之后的代码: package com.iamzken.google;   import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware;   public class SpringContextsUtil implements ApplicationContextAware {       private  ApplicationContext applicationContext;       public  Object getBean(String beanName) {         return applicationContext.getBean(beanName);     }       public  <T> T getBean(String beanName,Class<T> clazs) {         returnclazs.cast(getBean(beanName));     }       public voidsetApplicationContext(ApplicationContext applicationContext)             throws BeansException {         this.applicationContext =applicationContext;     } }   改动原因:使用非静态方法给静态成员变量直接赋值容易出现多线程安全问题,去掉static,成为实例成员方法和成员变量,或者改为单例模式!   20、      文件路径: com/iamzken/google/DateUtil.java 行数:179 修改之前代码片段: public static boolean compareDate(String date1, String date2) {        SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");         boolean flag = false;        try {            date1 = date1.replace(".", "/");            date2 = date2.replace(".", "/");            date1 = date1.replace("-", "/");            date2= date2.replace("-", "/");  修改之后代码片段: public static boolean compareDate(String date1, String date2) {         boolean flag = false;        try {            date1 = date1.replace(".", "/");            date2 = date2.replace(".", "/");            date1 = date1.replace("-", "/");            date2 = date2.replace("-", "/"); 改动原因:去掉无用的SimpleDateFormatdf = new SimpleDateFormat("yyyy/MM/dd");这句话 21、文件路径:   行数:281 修改之前代码片段:      public ModelAndView viewDetail(HttpServletRequest request,            HttpServletResponse response){        ModelAndView m = new ModelAndView(this.detailView);        Map<String, String> map = new HashMap<String,String>();        Long logid = Long.valueOf(request.getParameter("logid" )); 修改之后代码片段: public ModelAndView viewDetail(HttpServletRequest request,            HttpServletResponse response){         ModelAndView m = new ModelAndView(this.detailView);        Long logid = Long.valueOf(request.getParameter("logid" )); 改动原因: 去掉无用的      Map<String, String>map= new HashMap<String, String>(); 这句话   22、文件路径: com/iamzken/google/TradeZtcDetailService.java 行数:38 修改之前代码片段:      public Map addBatchTradeZtcDetail(List<String[]>list,String updateName) {        // 提示信息Map        Map tips = new HashMap();        // 验证错误信息的集合        List<String> errorList = new ArrayList<String>();        Map<String,SpecialMerchantInfo> map = new HashMap<String,SpecialMerchantInfo>();        // 代理商信息        List<AgentInfo>tradeZtcList = new ArrayList<AgentInfo>(); 修改之后代码片段:      public Map addBatchTradeZtcDetail(List<String[]>list,String updateName) {        // 提示信息Map        Map tips = new HashMap();        // 验证错误信息的集合        List<String> errorList = new ArrayList<String>();        // 代理商信息        List<AgentInfo>tradeZtcList = new ArrayList<AgentInfo>(); 改动原因:去掉无用的Map<String,SpecialMerchantInfo> map = newHashMap<String,SpecialMerchantInfo>();这句话   23、文件路径: com/iamzken/google/ExportAgentInfo.java 行数:47 修改之前代码片段: public void exportExcel(String title, String[] headers,List<T> dataList,            HttpServletResponse response, String pattern) throws IOException {        SimpleDateFormat sdf = new SimpleDateFormat(pattern);        OutputStream out = response.getOutputStream();        // 声明一个工作薄        SXSSFWorkbook workbook = newSXSSFWorkbook(5000); 修改之后代码片段:     public void exportExcel(String title, String[] headers,List<T> dataList,            HttpServletResponse response, String pattern) throws IOException {        OutputStream out = response.getOutputStream();        // 声明一个工作薄        SXSSFWorkbook workbook = newSXSSFWorkbook(5000); 改动原因: 去掉无用的SimpleDateFormat sdf = new SimpleDateFormat(pattern);这句话    24、文件路径: com/iamzken/google/PartnersWebServiceImpl.java 行数:337 修改之前代码片段:      public List<Map<String,String>>invoiceSolution(String requestNo, String billNo,            String status,PartnersModel[] partnersmodel) {        String errMsg ="";        String [] result=new String[8];        Map<String, Object>  map = new HashMap<String, Object>(); 修改之后代码片段:      public List<Map<String,String>>invoiceSolution(String requestNo, String billNo,            String status,PartnersModel[] partnersmodel) {        String errMsg ="";         Map<String,Object>  map = new HashMap<String,Object>(); 改动原因:去掉无用的String [] result=new String[8];这句话   25、文件路径: com/iamzken/google/ExportCommission.java 行数:49 修改之前代码片段: public void exportExcel(String title, String[] headers,List<T> dataList,            HttpServletResponse response, String pattern) throws IOException {        SimpleDateFormat sdf = new SimpleDateFormat(pattern);        OutputStream out =response.getOutputStream(); 修改之后代码片段:      public void exportExcel(String title, String[] headers,List<T> dataList,            HttpServletResponse response, String pattern) throws IOException {        OutputStream out =response.getOutputStream(); 改动原因:去掉无用的SimpleDateFormat sdf = new SimpleDateFormat(pattern);这句话    26、文件路径: com/iamzken/google/ExportMerchantInfo.java 行数:48 修改之前代码片段:      public void exportExcel(String title, String[] headers,List<SpecialMerchantInfo> dataList,            HttpServletResponse response, String pattern) throws IOException {         SimpleDateFormat sdf = new SimpleDateFormat(pattern);        OutputStream out = response.getOutputStream(); 修改之后代码片段:     public void exportExcel(String title, String[] headers,List<SpecialMerchantInfo> dataList,            HttpServletResponse response, String pattern) throws IOException {        OutputStream out =response.getOutputStream(); 改动原因:去掉无用的SimpleDateFormat sdf = new SimpleDateFormat(pattern);这句话    27、文件路径: com/iamzken/google/ExportMerchantRelate.java 行数:48 修改之前代码片段: public void exportExcel(String title, String[] headers, List  dataList,            HttpServletResponse response, String pattern) throws IOException {         SimpleDateFormat sdf = new SimpleDateFormat(pattern);        OutputStream out =response.getOutputStream(); 修改之后代码片段:      public void exportExcel(String title, String[] headers, List  dataList,            HttpServletResponse response, String pattern) throws IOException {        OutputStream out =response.getOutputStream(); 改动原因:去掉无用的SimpleDateFormat sdf = new SimpleDateFormat(pattern);这句话   28、文件路径: com/iamzken/google/ExportPublicity.java 行数:51 修改之前代码片段:      public void exportExcel(String title, String[] headers,            List<PreAuditItem> dataList, HttpServletResponseresponse,            String pattern) throws IOException {         SimpleDateFormat sdf = new SimpleDateFormat(pattern);              OutputStream out = response.getOutputStream(); 修改之后代码片段:      public void exportExcel(String title, String[] headers,            List<PreAuditItem> dataList, HttpServletResponseresponse,            String pattern) throws IOException {        OutputStream out =response.getOutputStream(); 改动原因:去掉无用的SimpleDateFormat sdf = new SimpleDateFormat(pattern);这句话   29、文件路径: com/iamzken/google/ExportTransDetail.java 行数:48 修改之前代码片段:      public void exportExcel(String title, String[] headers, List  dataList,            HttpServletResponse response, String pattern) throws IOException {         SimpleDateFormat sdf = new SimpleDateFormat(pattern);        OutputStream out =response.getOutputStream(); 修改之后代码片段:      public void exportExcel(String title, String[] headers, List  dataList,            HttpServletResponse response, String pattern) throws IOException {        OutputStream out =response.getOutputStream(); 改动原因:去掉无用的SimpleDateFormat sdf = new SimpleDateFormat(pattern);这句话    30、文件路径: com/iamzken/google/ExportVposDetail.java 行数:48 修改之前代码片段:      public void exportExcel(String title, String[] headers, List  dataList,            HttpServletResponse response, String pattern) throws IOException {        SimpleDateFormat sdf = new SimpleDateFormat(pattern);        OutputStream out =response.getOutputStream(); 修改之后代码片段:      public void exportExcel(String title, String[] headers, List  dataList,            HttpServletResponse response, String pattern) throws IOException {        OutputStream out =response.getOutputStream(); 改动原因:去掉无用的SimpleDateFormat sdf = new SimpleDateFormat(pattern);这句话   31、文件路径: com/iamzken/google/ExcelReader.java 行数:157 修改之前代码片段:          public String[]getRowData(int sheetIndex,int rowIndex){            String[] dataArray = null;            if(rowIndex>this.getColumnNum(sheetIndex)){              return dataArray;            }else{              dataArray = new String[this.getColumnNum(sheetIndex)];              return this.dataList.get(rowIndex);            } 修改之后代码片段:         public String[]getRowData(int sheetIndex,int rowIndex){            String[] dataArray = null;            if(rowIndex>this.getColumnNum(sheetIndex)){              return dataArray;            }else{              return this.dataList.get(rowIndex);            } 改动原因:去掉无用的dataArray = newString[this.getColumnNum(sheetIndex)];  这句话

转载于:https://www.cnblogs.com/iamconan/p/7383530.html

最新回复(0)