FindBugs简单了解

FindBugs-IDEA是个好东西,它是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式。

常见findBugs缺陷类型

(1)Bad pratice编程的坏习惯 。主要是命名问题,比如类名最好以大写开头,字符串不要使用等号不等号进行比较,可能会有异常最好用try-catch包裹的代码,方法有返回值但被忽略等等,这些如果不想改可以直接忽略.

(2)Multithreaded correctness 多线程安全问题。比如使用了非线程安全的类,如DateFormats,后面给了例子。

(3)Malicious code vulnerability 恶意代码漏洞 。看着比较吓人的提示,但主要是一些属性直接使用public让别的类来获取,建议改为private并为其提供get/set方法;还有一些public的静态字段,可能会被别的包获取之类的;这些也需要根据项目具体情况来,个人意见,在有的不重要类,有时直接公开使用属性,可能更为便捷.如果你认为这些不需要修改,完全可以忽略。

(4)Dodgy code 糟糕垃圾的代码 。·

比如一个double/float被强制转换成int/long可能会导致精度损失,一些接近零的浮点数会被直接截断,事实上我们应该保留。

在类型转换的时候,我们应该为类型转换提供一个安全的转换方法,因为我们永远不会知道,我们的app在用户手里会发生什么,所以我们要尽可能的去减少这种发生错误的可能。

比如使用switch的时候没有提供default。

比如多余的空检查,就是不可能为空的值,增加了不为空判断,这是没有必要的。属于代码冗余。

比如不安全的类型转换等等。

……

(5)performance 性能 。主要是一些无用的代码,比如声明了没有用到的属性等等。

(6)correctness 代码的正确性 这一项最重要,没有对变量进行不为空判定,在特殊情况可能发生空指针异常。

Attention: 推荐看下《app研发录》《java开发规范》

常见错误示例

1)线程安全性问题

As the JavaDoc states, DateFormats are inherently unsafe for multithreaded use. The detector has found a call to an instance of DateFormat that has been obtained via a static field. This looks suspicous.

描述:使用了线程不安全的SimpleDateFormat sdf

解决办法

(1)将上述变量定义为局部变量。缺点:每调用一次方法就会创建一个SimpleDateFormat对象,方法结束又要作为垃圾回收。

(2)使用synchronized给对象关键词加锁,即 synchronized (sdf) 性能较差,每次都要等待锁释放后其他线程才能进入使用该对象。

(3)使用ThreadLocal,为每个线程创建SimpleDateFormat对象副本,可提高性能。这里推荐最后一种解决办法。

public class DateUtil {
private static ThreadLocal<SimpleDateFormat> local = new ThreadLocal<SimpleDateFormat>(); public static Date parse(String str) throws Exception {  SimpleDateFormat sdf = local.get();  if (sdf == null) {  sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);  local.set(sdf);  }  return sdf.parse(str);  }        public static String format(Date date) throws Exception {  SimpleDateFormat sdf = local.get();  if (sdf == null) {  sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);  local.set(sdf);  }  return sdf.format(date);  }
}  

2)EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC

equals method overrides equals in superclass and may not be symmetric

描述:equals方法覆盖了父类的equals,可能功能不符实际。

3)May expose internal representation by incorporating reference to mutable object

描述:可能存在值被修改的危险,即Data类型赋值存在引用传递危险

原因:Date类型是引用传递,不是值传递,Data B 赋给Date A之后,当Date B修改之后,Date A也会发生变化,所以存在危险。

解决办法:利用浅克隆,生成副本赋值,this.passTimeStart = (Date)passTimeStart.clone();

4)Class defines compareTo(...) and uses Object.equals()

描述: Java Bean类实现了Comparable接口,但却使用了父类(java.lang.Object类)的equals方法,没有覆盖父类的实现,违反了接口的使用规则。

解决办法:这个Java Bean类中覆盖父类的equals方法。实现equals方法时,需要同步实现hashCode方法。

5)Inefficient use of keySet iterator instead of entrySet iterator

描述:建议使用EntrySet而不是keySet

原因:后者比前者高一倍效率,entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率;

解决办法:使用如下例子

Iterator<Map.Entry<String,List<DataDictDTO>>> iterator=dictMap.entrySet().iterator();
while(iterator.hasNext()){Map.Entry<String,List<DataDictDTO>> e=iterator.next();if (CollectionTool.isNotBlank(e.getValue())) {map.put(e.getKey(), JacksonTool.bean2Json(e.getValue()));}
}

6)ICAST_INTEGER_MULTIPLY_CAST_TO_LONG

Result of integer multiplication cast to long

描述:整形数做乘法运算结果转换为long值时超出范围;

解决办法:附加转为办法

(1)将long型转化为int型,这里的long型是基础类型:

long   a = 10;     int b = (int)a;

(2)将Long型转换为int 型的,这里的Long型是包装类型:

Long a = 10; int b=a.intValue();

(3)将int型转化为long型,这里的int型是基础类型:

int a = 10;long b = (int)a;

(4)将Integer型转化为long型,这里的Integer型是包装类型:

int a = 10;Long b = a.longValue();

7)A boxed value is unboxed and then immediately reboxed.

描述:使用三目运算符时,类型不一致,包装类和基础类反复拆箱装箱,装箱的值被拆箱,然后立刻重新装箱。

解决办法:三元运算符两个分支的返回类型保持一致。

8)Method concatenates strings using + in a loop

The method seems to be building a String using concatenation in a loop. In each iteration, the String is converted to a StringBuffer/StringBuilder, appended to, and converted back to a String. This can lead to a cost quadratic in the number of iterations, as the growing string is recopied in each iteration.

Better performance can be obtained by using a StringBuffer (or StringBuilder in Java 1.5) explicitly.

描述:在循环里面使用了字符串串联使用方法+

原因:该方法似乎是建立在循环使用字符串串联。在每次迭代中,字符串转换为一个StringBuffer / StringBuilder的,附加到字符串,并转换回为String。这可能导致成本的二次迭代,因为不断增长的字符串是在每次迭代中重新复制。

解决办法:为了有更好的性能,可使用StringBuffer或StringBuilder。

9)Method may fail to clean up stream or resource on checked exception

描述及原因:可能在关闭之前就出现异常退出了,另外释放资源资源之前需要判空,释放资源时需要扑捉异常

解决办法:正确姿势为

private static String FileWriter() {FileWriter fw = null;try {fw = new FileWriter("summer");fw.append("_heart");} catch (Exception e) {return e.toString();} finally {//不管成不成功都关闭if (fw != null) {try {fw.close();} catch (Exception e2) {return e2.toString();}}}return null;
}

10)Reliance on default encoding

Found a call to a method which will perform a byte to String (or String to byte) conversion, and will assume that the default platform encoding is suitable. This will cause the application behaviour to vary between platforms. Use an alternative API and specify a charset name or Charset object explicitly.

描述:FileWriter FileReader 是不带编码格式的,默认使用本机器的默认编码,那么就会因为编码问题而出现bug的

解决办法:使用父类实现编码,则可以避免这个问题

public void generateErrorCode(File file)  {BufferedWriter writer=null;try {OutputStreamWriter fileWriter=new OutputStreamWriter(new FileOutputStream(file),"UTF-8");writer=new BufferedWriter(fileWriter);for (Srting str : strList) {writer.write(str);}}catch (IOException e1) {e1.printStackTrace();}catch (Exception e2) {e2.printStackTrace();}finally {if(writer!=null){try{writer.close();}catch (Exception e3){e3.printStackTrace();}}}
}

11)Exception is caught when Exception is not thrown

描述:异常捕捉有问题

原因:一般出现错误就是这种代码导致的

try{doSomething(……)
}catch(Exception ex){//
}

解决办法:JAVA规范中并不推荐这样做,这样是属于“过泛地捕获异常”,因为try{}中可能出现的异常种类有很多,上面的做法不利于分别处理各种异常,建议根据业务需求,分别捕获需要特别处理的异常,例子如下:

try{doSomething(……)
}
catch(SQLException ex){}catch(IOException ex){}catch(Exception ex){}

FindBugs常见错误介绍、分析、处理相关推荐

  1. SAP UI5 应用开发教程之三十九 - SAP UI5 应用出现白屏的一些常见错误和分析方法分享试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  2. c51单片机汇编语言语法错误,单片机汇编语言常见错误知识点分析

    描述 汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的惟一语言.因而对程序的空间和时间要求很高的场合,汇编语言的应用是必不可少的.至于很多需要 ...

  3. findbugs常见错误总结

    一.前置说明:   官网提供了所有的bug描述信息:官网bug描述链接 ,根据findbugs扫码结果中的关键字搜索即可找到bug的描述信息甚至是修复方案. 二.findbugs常见错误 Method ...

  4. SAP UI5 应用开发教程之三十九 - SAP UI5 应用出现白屏的一些常见错误和分析方法分享

    SAP UI5 应用开发完毕后,加载时没有显示任何内容,只有一个白茫茫的空白屏幕(blank screen),无疑是让很多 SAP UI5 开发人员感到沮丧的事情. 然而这种白屏总是伴随着浏览器(比如 ...

  5. 蜂鸣器干扰通讯_蜂鸣器常见错误电路分析

    ) 表示. 下面我们介绍最常用的两类蜂鸣器 : 有源蜂鸣器和无源蜂鸣器. 从驱动方式分类, 有源驱动和无源驱动, 有源蜂鸣器又称为直流蜂鸣器, 其内部已经包 含了一个多谐振荡器, 只要在两端施加额定直 ...

  6. python17个常见问题_17个Python 常见错误的分析,你都遇到过哪些?

    对于刚入门的Pythoner在学习过程中运行代码是或多或少会遇到一些错误,刚开始可能看起来比较费劲.随着代码量的积累,熟能生巧当遇到一些运行时错误时能够很快的定位问题原题.下面整理了常见的17个错误, ...

  7. 堡垒前线辅助游戏错误操作 常见错误介绍

    即将上线的堡垒前线是由网易发行的一款RCS即时创造射击手游,游戏在传统射击游戏的基础上增加了很多新样式,网易的画质一般也构不成槽点,在射击游戏中,可能新人玩家就会误入很多的误区加深这个游戏的难度.那么 ...

  8. 已知三角形三边长怎么求面积_解三角形问题中的常见错解分析

    解三角形问题是个难点,怎样才能突破这个难点呢? 只有正确理解三角形中的边角关系,即三角形中的边角等量关系.边角的不等关系及内角和关系,才能克服这个难点. 下面快和包sir一起对解三角形问题中的常见错误 ...

  9. Struts常见错误及原因分析

    1 异常 javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login (/Login是你的action名字) 可 ...

最新文章

  1. 社会计算研究组研究方向
  2. 新上任项目经理遇到的难题
  3. iOS10 UI教程视图的绘制与视图控制器和视图
  4. 动态规划 dp04 凸n边形的三角形划分 c代码
  5. 交叉报表问题 subDataset
  6. java中long类型转换为int类型
  7. 看得懂的外观设计模式 python3 实现
  8. 安卓逆向_3 --- 篡改apk名称和图标、修改包名实现应用分身、修改资源去广告、去除re管理器广告
  9. php 共享内存列队,php中对共享内存,消息队列的操作
  10. java集合中中文排序_利用Collator和Collections.sort对list进行中文排序,注意与Arrays.sort的区别...
  11. linux设置环境变量 临时设置 和 永久设置
  12. MS CRM 2011 Q2的一些更新
  13. 数据库一对一、一对多、多对多关系理解(转载)
  14. 西安电子科技大学计算机学院评论,放弃985,选择西安电子科技大学计算机专业,网友表示没毛病...
  15. tan和cot的梗_“sin对cos说 我们今晚是tan呢?还是cot呢?”啥意思
  16. Software System [vaynexiao]
  17. linux shell自动登录,Shell自动登录并执行命令
  18. 《计算机网络 第7版》第9章 无线局域网的物理层和MAC层
  19. H5制作视频网页的架构
  20. 数字未来 认识DMA基金会

热门文章

  1. 【Day4】ES5(循环别名 ,数组,数组遍历,数组排序,二维数组)
  2. 【论文】期刊和会议如何查询、期刊级别分类和顶会概念一文精析
  3. 数据库MySQL之如何查看表?
  4. UI设计师如何正确使用调色板
  5. 基于小波时频图和2D-CNN的滚动轴承故障检测
  6. 巴菲特:人一生中最重要的是专注
  7. 使用SQL语句创建数据表(SQL Server)
  8. String类中split方法坑点及解决方案
  9. fastadmin 子级菜单展开合并,分类父级归纳
  10. Himall商城企业付款通知