• eclipse插件FindBugs使用笔记


    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)];  这句话

  • 相关阅读:
    java 学习之环境配置
    报表设计--分组报表-普通分组-纵向扩展
    报表设计--网格式报表
    报表设计--简单报表
    SDP平台操作视频
    页面设计--Tree目录树
    页面设计--Grid列表
    页面设计--RadioButton
    页面设计--CheckBoxList
    页面设计--TextBox
  • 原文地址:https://www.cnblogs.com/iamconan/p/7383530.html
Copyright © 2020-2023  润新知