前言
新手开发往往不能意识到自己程序中存在的bug、会导致什么问题,即使意识到也不知道怎样的代码是最佳实践,怎样修改fix能达到最好的效果。有了FindBugs这款神器能够帮助开发者在开发过程中找到bug、不规范,这种有反馈的编码才是有效的编码,否则写了再多行代码,不知道是对是错,能力和经验永远不能精进!用这款神器,慢慢地改变自己不好的编码习惯,存在的问题,慢慢习惯最佳实践,日积月累,代码能力绝对能步步高升~
0. 安装使用
http://findbugs.sourceforge.net/manual/index.html 官方操作手册
重启后,点开插件tab页,点击扫描,我的项目中存在一些问题,分为了7大类
- Internationalization:国际化相关问题,如错误的字符串转换(字符集相关);
- Bad practice:坏的实践:常见代码错误,序列化错误,用于静态代码检查时进行缺陷模式匹配;
- Multithreaded correctness:多线程的正确性:如多线程编程时常见的同步,线程调度问题;
- Dodgy code:不符合规范的代码
- Correctness:可能导致错误的代码,如空指针引用等;
- Performance:运行时性能问题,如由变量定义,方法调用导致的代码低效问题。
- Malicious code vulnerability:恶意代码
- Experimental:可能受到的恶意攻击,如访问权限修饰符的定义等;
- Security:安全性
如果是增量的类,可以选择扫描范围
下面介绍以下常见的bug、扫描的效果 以及如何fix。
1.Internationalization国际化
这里是典型的字符串-字节数组转换存在的问题,此处的new String(chdata)没有指定字符集,导致从字节数组解码到字符串时,会使用系统默认编码,如果该代码部署到与开发机器字符集不一致的机器上,有可能出现乱码。
以下两种调用都会存在相同的问题,fix这个问题,应该使用指定字符集的api方法
int strLen = str.getBytes().length;new String(bytes);//java.lang.String
public String(byte bytes[], Charset charset){}
public byte[] getBytes(String charsetName){}
2.Correctness正确性
2.1 非空检查
尤其是数组的检查,经常会忽略,如果不加上非空判断,会抛出NPE
@Test
public void nullArray() {byte[] bytes = null;String str = new String(bytes);
}// 加上非空检查
if (array == null) {return null;
}
3.Performance性能
3.1 装箱拆箱
能够使用原始类型,尽量不要重复地装箱拆箱。
报错:从字符串创建继承类型装箱对象,只是为了提取拆箱后的值,调用静态parseXXX方法会更有效。
int reqTimes = StringUtil.isBlank(reqTimesStr)?0:Integer.valueOf(reqTimesStr);//装箱又拆箱,性能损失
int reqTimes = StringUtil.isBlank(reqTimesStr)?0:Integer.parseInt(reqTimesStr);
4.Experimental
4.1 资源未关闭
@Test
public void fileClose() {try {// 文件资源FileInputStream fispem = new FileInputStream("/.../paytest.cer");...}catch (Exception e){e.printStackTrace();}
}
报错:方法可能无法清理流或资源
此方法可能无法清除(关闭,处置)流,数据库对象或其他需要显式清除操作的资源。
通常,如果某个方法打开流或其他资源,则该方法应使用try / finally块来确保在该方法返回之前清除该流或资源。
这种情况下,这种代码如果受到恶意攻击,如数据连接等等会导致资源耗尽。
可以像下面一样fix:
@Test
public void fileClose() {FileInputStream fispem = null;try {// 文件shu输入流fispem = new FileInputStream("/.../paytest.cer");...}catch (Exception e){e.printStackTrace();...} finally {IOUtils.closeQuietly(fispem);}
}
总结
还有更多类型的bug,如果仅根据findBugs工具的提示,还是不知道如何修改,可以复制相关的类到
http://www.javased.com/ 看优秀项目的样例代码,看看别人是怎么修的以便修改。