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

eclipse插件FindBugs使用笔记的更多相关文章

  1. Eclipse插件 - FindBugs 检查代码隐藏的 Bug

    简介         FindBugs 是一个在 Java 程序中查找 bug 的程序,它可以查找可能出错的代码,注意 FindBugs 是检查 Java 字节码,也就是*.class文件.其实准确的 ...

  2. 笔记:eclipse的findbugs插件安装成功却不显示

    关键字:findbugs eclipse的findbugs插件安装成功却不显示的原因有: 1.插件版本太高,低版本的eclipse不兼容 2.也有可能是JDK版本低 findbugs安装方法: 1.在 ...

  3. Eclipse的FindBugs插件

      Eclipse的FindBugs插件     问题提出: 当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被 ...

  4. Eclipse 安装FindBugs插件

    FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具.FindBugs通过检查类文件或 JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析.FindBug ...

  5. eclipse插件之Findbugs、Checkstyle、PMD安装及使用

    eclipse插件之Findbugs.Checkstyle.PMD安装及使用 一.什么是Findbugs.checkstyle.PMD Findbugs.checkstyle和PMD都可以作为插件插入 ...

  6. 解决低版本Eclipse安装Findbugs插件无法显示问题

    问题描述 Eclipse安装Findbugs,显示安装成功,但是重启Eclipse在[Window]-[show view]-[other]中没有显示 原因 Eclipse版本太低,新版的Findbu ...

  7. Hadoop学习笔记—6.Hadoop Eclipse插件的使用

    开篇:Hadoop是一个强大的并行软件开发框架,它可以让任务在分布式集群上并行处理,从而提高执行效率.但是,它也有一些缺点,如编码.调试Hadoop程序的难度较大,这样的缺点直接导致开发人员入门门槛高 ...

  8. 常用的4个eclipse插件安装过程及使用方法

    最近整合了4个常用eclipse插件安装过程,分别是PMD.checkstyle.findbugs.sourcemonitor插件.因为我这里没有外网,所以所有的插件不是最新版,建议有网的童鞋自行在外 ...

  9. Eclipse插件checkstyle安装使用

    方法一:   1.Eclipse中,选择Help->Software Updates->Find and Install   2.选择 Search for new features to ...

  10. Java程序员25个必备的Eclipse插件

    原文:http://www.fromdev.com/2012/01/25-best-free-eclipse-plug-ins-for-java.html "工欲善其事, 必先利器" ...

随机推荐

  1. IT管理:开篇 - IT管理系列文章

    以前看短视频,有一段郑翔洲老师讲到公司的价值问题,所以有此文,对这个公司的价值问题的理解描述. 一.        公司赚钱: 在以前的博文里,笔者就有写过一篇(7.正确的赚钱方式 - CEO之公司管 ...

  2. 【C++深度剖析】为什么C++支持函数重载而C不支持--C++程序编译链接过程--符号表生成规则【Linux环境超详细解释C++函数重载底层原理】

    文章目录 前言 Linux环境g++编译器的配置以及一些准备工作 源文件的符号表生成以及分析 尾声 前言 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种 ...

  3. Oracle私网mtu滚动修改实施方案

    之前测试遇到过mtu修改不能滚动的情况,目前在自己测试环境重新反复验证发现正常是可以滚动的,下面梳理下整个实施方案: 环境:RHEL6 + Oracle 11.2.0.4 RAC(2 nodes) / ...

  4. .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记

    2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...

  5. .NET Core开发实战(第30课:领域事件:提升业务内聚,实现模块解耦)--学习笔记

    30 | 领域事件:提升业务内聚,实现模块解耦 我们在领域的抽象层定义了领域事件和领域事件处理的接口 IDomainEvent namespace GeekTime.Domain { public i ...

  6. Visual Studio部署matplotlib绘图库的C++版本

      本文介绍在Visual Studio软件中配置.编译C++环境下matplotlibcpp库的详细方法.   matplotlibcpp库是一个C++环境下的绘图工具,其通过调用Python接口, ...

  7. 统一日志输出打印POST请求参数

    众所周知,request.getInputStream()只能调一次.如果希望在请求进入Controller之前统一打印请求参数(拦截器或过滤器),又不影响业务,我们只能将获取到的输入流缓存起来,后续 ...

  8. win10无法保存代理服务器设置

    问题说明 通过Internet设置->链接->局域网设置->代理服务设置,填写完地址后点选"确定"无反应,关闭窗口后重新打开'局域网设置',数据全无. 通过 开始 ...

  9. 微信小程序引入iconfont实现添加自定义颜色图标

    说明 最近搞微信小程序,需要添加一些图标,发现引入iconfont还是有几个步骤,就记录下来分享以下. 以下配置方法支持自定义颜色的. 操作步骤 1. 在iconfont网站挑选自己需要的图标,添加到 ...

  10. 简单了解HTTP、Websocket和Netty

    前言 伴随着网络的快速发展,网络通讯越来越重要,通讯的快捷.安全.方便影响着用户的体验.本文将探讨这些技术的原理.特点以及在实际应用中的应用场景. 1.HTTTP(超文本传输协议) HTTP是一种传输 ...