使用findbugs为自己的代码review
转自:http://blog.lichengwu.cn/java/2013/11/24/use-findbugs-code-review/
介绍
Findbugs是一个代码静态分析工具,用来找出Java代码中的bug。通过分析字节码并与一组缺陷模式匹配,找出代码中的问题。
目前Findbugs支持除了java 8以外的所有版本编译的字节码文件分析。
Findbugs不仅提供了可视化界面,还有Idea,Eclipse插件。
Findbugs有谷歌和SUM/(Oracle)支持,在JDK源码编译中,依赖了Findbugs对JDK源码的检查。也就是说,虽然可以自由编译JDK,但是如果修改后的代码太烂,不能通过Findbugs的检查,一样不能通过编译。
使用
项目地址:http://findbugs.sourceforge.net/
Findbugs支持命令行,ant,可视化界面和IDE插件方式运行,以IDEA的插件使用为例。
Eclipse插件安装地址:http://findbugs.cs.umd.edu/eclipse/
IDEA插件安装地址:http://plugins.jetbrains.com/plugin/3847

支持类型
在Findbugs中能找到下面类型的bug(有些不算是bug,应该说是不好的实践)。
Cateory
Number
Samples
Correctness
142
Illegal format string
Null value is guaranteed to be dereferenced
Call to equals() comparing unrelated class and interface
Bad practice
84
Confusing method names
Method may fail to close stream
Comparison of String parameter using == or !=
Dodgy code
71
Useless control flow
Integer remainder modulo 1
Redundant null check of value known to be null
Multithreaded Correctness
45
A thread was created using the default empty run method
Class's writeObject() method is synchronized but nothing else is
Performance
27
Method concatenates strings using + in a loop
Method invokes inefficient Boolean constructor
Malicious Code Vulnerability
15
Finalizer should be protected, not public
Field isn't final and can't be protected from malicious code
Security
11
Hardcoded constant database password
A prepared statement is generated from a variable String
Experimental
3
Method may fail to clean up stream or resource
Internationalization
2
Consider using Locale parameterized version of invoked method
发现代码中的问题
性能:
低效的迭代器:
修改后:
for (Integer groupKey : groupList.keySet())
insertGroupedList(groupKey);
}
装箱/拆箱
0L在java.lang.Long中是有缓存的,所以常量0L先拆箱成小long,然后赋值给agengId的时候装箱成大Long,两次操作就是没有必要的。
修改后:
agentId = (agentId == null) ? Long.valueOf(0) : agentId;
静态变量:

这个常量是在初始化的时候赋值的,在内存中没有必要存在多份,可以声明成static。
内部类,何不静态?

MuFlightInfoDO是MuFlightFareQuery的内部类,MuFlightInfoDO的实例保存了一份创建它的类(MuFlightFareQuery)的引用,这样不仅使MuFlightInfoDO类占用更大的空间,而且是外部的MuFlightFareQuery生命周期更长了。
不好的实践:
忽略异常:

集合使用removeAll来清理:

直接调用clear()或者是个bug?
流程:

else if里面有没任何代码,考虑删除。
集合:

hsfServices 声明成map:ConcurrentHashMap<String,HSFSpringConsumerBean hsfServices>
在这里hsfServices.contains(key)参数是String类型,但是声明的map是HSFSpringConsumerBean类型,应该永远不会返回true,应该是containsKey吧?
equal类型不匹配:

dfare.getAgentSupportType().equals(AgentSupportType.ONE) 左边Integer,右边enum。
线程安全:
DateFormat
DateFormat不是线程安装的,在这里声明为类成员,会有问题。
总结
有些代码问题在人为的review的时候很难发现,如果上线了会有很大的隐患,虽然当时没有出现bug。利用Findbugs在提交代码的时候自己进行review。让你的代码出更少的bug。
Keep the bar green, keep you code clean.
使用findbugs为自己的代码review的更多相关文章
- 部署代码review和CI
公司原先搭了一个代码Review的服务器,由于历史原因,装的是一个32bit的Ubuntu系统,后来由于需要,需要安装gitlab,由于gitlab需要64位系统,所以临时凑合了个vagrant,本质 ...
- 前端代码质量保障之代码review
经验丰富的程序员和一般程序员之间的最大区别,不仅体现在解决问题的能力上, 还体现在日常代码的风格上.掌握一门技术可能需要几月,甚至几周就够了. 好的习惯风格养成却需数年. 团队成员之间需要合作,代码需 ...
- 由学习《软件设计重构》所想到的代码review(一)
前言 对于一个程序猿来讲怎样来最直接的来衡量他的技术能力和产出呢?我想最直观的作法是看他的代码编写能力,就拿我常常接触的一些程序猿来看,他们买了非常多技术重构类书籍.可是看完后代码编写能力并没有显著提 ...
- 对于近阶段公司代码 review 小结
来新公司,给公司的SDK review了一下.发现了不少小问题,在此总结一下. (我下面说明问题可能是很简单,但是搞清楚某些问题还是花了些时间的,大家引以为戒吧) 先谈谈处理的问题: 1.某天QA说有 ...
- 代码review的流程
以前我们一直都是如果要进行代码review的时候,要不我们就直接用idea来进行查看,根据不同的来查看 但是我们都是看代码的不同来进行来实现的,其实我们不需要这样,我们可以使用工具Phabricato ...
- 研发团队如何借助Gitlab来做代码review
代码review是代码质量保障的手段之一,同时开发成员之间代码review也是一种技术交流的方式,虽然会占用一些时间,但对团队而言,总体是个利大于弊的事情.如何借助现有工具在团队内部形成代码revie ...
- Gitlab来做代码review
Gitlab来做代码review 代码review是代码质量保障的手段之一,同时开发成员之间代码review也是一种技术交流的方式,虽然会占用一些时间,但对团队而言,总体是个利大于弊的事情.如何借助现 ...
- 代码review
对于代码review个人也有些小小的看法: 1.首先我觉得我们所有开发人员要弄明白 现在Code Review 的目的 ,凡事不弄明白目的,无法做好完成一件事情,个人觉得有以下一些目的: a)可以在项 ...
- Gerrit代码Review实战
代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略.在实践中,给大家推荐一款免费.开放源代码的代码审查软件Gerri ...
随机推荐
- js实现a_b变成A B的两种方法
1.var key = 'a_b'; var a = key.replace(/\b.|_./g, function (i) { if (i.length === 2) { i = ' ' + i[1 ...
- 第七章 介词(La préposition )
法语中的介词是将两个同类或非同类的词连接在一起,把一个句中成分同另一个句子成分联系起来,并表明两者之间关系的词类.介词是一种无词性变化的词类. ★介词的形式 ()简单形式的介词,如: ()复合形式的介 ...
- web页面中a标签下载文件包含中文下载失败的解决
之前用到的文件下载,文件名都是时间戳的形式或者英文名.下载没有问题.后来附件有中文后写在页面是下面效果,点击下载,下载失败. 对应链接拿出来.是如下效果 之前用了各种其他办法都不理想,比如转义什么的. ...
- DIV+CSS实战(五)
一.说明 前面实现了关键词订阅模块,现在实现站点订阅模块,主要实现的是站点添加界面.站点添加界面里面实现一个提示框不在提示的功能(保存到cookie中),还有就是实现一个站点的选择框,包括输入文字自动 ...
- SpringMVC上传图片总结(2)--- 使用百度webuploader上传组件进行上传图片
SpringMVC上传图片总结(2)--- 使用百度webuploader上传组件进行上传图片 在上一篇文章中,我们介绍了< SpringMVC上传图片的常规上传方法 >.本文接着第一 ...
- TFS Training for Kunlun bank (http://www.klb.cn/) 微软研发流程(ALM)管理培训会议(昆仑银行) 2016.09.21
银行一直是微软技术的伤心地,由于历史原因,微软技术和产品一直很难进入到银行业务的核心区域,但是微软今年来的进步不少,在开发工具和平台方面已经连续攻克了几个典型的金融企业,例如农业银行,中国人保等. 应 ...
- 【转】Swig使用指南
如何使用 API swig.init({ allowErrors: false, autoescape: true, cache: true, encoding: 'utf8', filters: { ...
- subprocess.Popen 运行windows命令出现“句柄无效”报错的解决方法
在框架开发中遇到 subprocess执行多了,就会好句柄无效的问题,终于找到解决方案:如下,修改subprocess中的一点代码就好,也不知道这是不是Python 的bug因为,Python27时没 ...
- [.net]线程基础
关于线程的诞生 早期的16位Windows只有一个执行线程,在执行各种程序时,如果这个线程运行出现了问题,就会“冻结”整个系统,使得系统处于未响应状态.这是一件多么尴尬的事儿,无论是用户还是微软自己, ...
- JDK源码分析(10) CopyOnWriteArrayList
概述 CopyOnWriteArrayList是一个线程安全集合,原理简单说就是:在保证线程安全的前提下,牺牲掉写操作的效率来保证读操作的高效.所谓CopyOnWrite就是通过复制的方式来完成对数据 ...