一、FindBugs简介(盗取百度知道)
FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式(请参阅 参考资料)。图 1 显示了分析一个匿名项目的结果(为防止可怕的犯罪,这里不给出它的名字):
在FindBugs的GUI中,需要先选择待扫描的.class文件(FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。)。如果你拥有这些.class档对应的源文件,可把这些.java文件再选上,这样便可以从稍后得出的报告中快捷的定位到出问题的代码上面。此外,还可以选上工程所使用的library,这样似乎可以帮助FindBugs做一些高阶的检查,藉以发现一些更深层的bug。
选定了以上各项后,便可以开始检测了。检测的过程可能会花好几分钟,具体视工程的规模而定。检测完毕可生成一份详细的报告,藉由这份报告,可以发现许多代码中间潜在的bug。比较典型的,如引用了空指针(null pointer dereference), 特定的资源(db connection)未关闭,等等。如果用人工检查的方式,这些bug可能很难才会被发现,或许永远也无法发现,直到运行时发作…当除掉了这些典型的(classic) bug后,可以确信的是,我们的系统稳定度将会上一个新的台阶。
二、安装findbugs
1)选择idea配置面板,我以mac为例,windows是打开settings
2)选择插件仓库
3)输入插件名称,install即可,因为我已安装所以显示restart
4)如果安装或下载失败,也可以自己进行下载插件后安装,选择你要的版本
官网地址:https://plugins.jetbrains.com/plugin/3847?pr=idea
但是需要注意你的idea版本,官网有特别说明
三、使用小测
我也刚开始使用,功能还在探索之中,以下是我以前写的一个测试用例,安装完成了先来搞一下看看
package com.yeepay.g3.app.watch.Array;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
/**
* 类名称: ArrayList <br>
* 类描述: <br>
*
* @author: hua.jin
* @since: 16/8/18 下午3:15
* @version: 1.0.0
*/
public class ArrayListMemo {
public static void main(String[] args) throws IOException {
Runtime run = Runtime.getRuntime();
run.gc();
System.out.println("time: " + (new Date()));
// 获取开始时内存使用量
long startMem = run.totalMemory() - run.freeMemory();
System.out.println("memory> total:" + run.totalMemory() + " free:" + run.freeMemory() + " used:" + startMem);
ArrayList list = new ArrayList();
int size = 10000000;
int i = 0;
try {
list.ensureCapacity(size);// 是否扩容
for (; i < size; i++) {
list.add(i);
}
} catch (Throwable e) {
e.printStackTrace();
System.out.println("i= " + i);
}
System.out.println("time: " + (new Date()));
long endMem = run.totalMemory() - run.freeMemory();
System.out.println("memory> total:" + run.totalMemory() + " free:" + run.freeMemory() + " used:" + endMem);
System.out.println("memory difference:" + (endMem - startMem));
}
}
1)选中你要检测类进行右键操作
2)确认检测
3)弹出检测结果
4)信息内容
a) compiler issues,编译器问题。感觉就是一些警告信息,待确认的信息
因为我在创建list的时候没有设置参数类型,但是添加信息确是数字
ArrayList list = new ArrayList();
b) javadoc 问题暂时没出有用信息
c) probable bugs 重点来了
由于我只是测试arraylist的扩容问题,所以并未对list的结果有任何应用,所以提示bug如下
contents of collection 'list' are updated,but never queried at line 26
四、bug修复如下
package com.yeepay.g3.app.watch.Array;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
/**
* 类名称: ArrayList <br>
* 类描述: <br>
*
* @author: hua.jin
* @since: 16/8/18 下午3:15
* @version: 1.0.0
*/
public class ArrayListMemo {
public static void main(String[] args) throws IOException {
Runtime run = Runtime.getRuntime();
run.gc();
System.out.println("time: " + (new Date()));
// 获取开始时内存使用量
long startMem = run.totalMemory() - run.freeMemory();
System.out.println("memory> total:" + run.totalMemory() + " free:" + run.freeMemory() + " used:" + startMem);
<span style="color:#FF0000;"> ArrayList<Integer> list = new ArrayList<Integer>();</span>// 添加类型
int size = 10000000;
int i = 0;
try {
list.ensureCapacity(size);// 是否扩容
for (; i < size; i++) {
list.add(i);
}
} catch (Throwable e) {
e.printStackTrace();
System.out.println("i= " + i);
}
<span style="color:#FF0000;"> System.out.println("size: " + list.size());</span>// 修改信息之后引用输出
System.out.println("time: " + (new Date()));
long endMem = run.totalMemory() - run.freeMemory();
System.out.println("memory> total:" + run.totalMemory() + " free:" + run.freeMemory() + " used:" + endMem);
System.out.println("memory difference:" + (endMem - startMem));
}
}
检测结果如下:
学习使用中,后续使用过程中持续更新