【BugFix】工具推荐 FindBugs-IDEA

前言

新手开发往往不能意识到自己程序中存在的bug、会导致什么问题,即使意识到也不知道怎样的代码是最佳实践,怎样修改fix能达到最好的效果。有了FindBugs这款神器能够帮助开发者在开发过程中找到bug、不规范,这种有反馈的编码才是有效的编码,否则写了再多行代码,不知道是对是错,能力和经验永远不能精进!用这款神器,慢慢地改变自己不好的编码习惯,存在的问题,慢慢习惯最佳实践,日积月累,代码能力绝对能步步高升~

0. 安装使用

http://findbugs.sourceforge.net/manual/index.html 官方操作手册

重启后,点开插件tab页,点击扫描,我的项目中存在一些问题,分为了7大类

  1. Internationalization:国际化相关问题,如错误的字符串转换(字符集相关);
  2. Bad practice:坏的实践:常见代码错误,序列化错误,用于静态代码检查时进行缺陷模式匹配;
  3. Multithreaded correctness:多线程的正确性:如多线程编程时常见的同步,线程调度问题;
  4. Dodgy code:不符合规范的代码
  5. Correctness可能导致错误的代码,如空指针引用等;
  6. Performance运行时性能问题,如由变量定义,方法调用导致的代码低效问题。
  7. Malicious code vulnerability:恶意代码
  8. Experimental可能受到的恶意攻击,如访问权限修饰符的定义等;
  9. 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/ 看优秀项目的样例代码,看看别人是怎么修的以便修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值