IntelliJ IDEA 使用 FindBugs 进行代码分析

FindBugs 介绍

FindBugs 是一个使用静态分析来 ** 查找 Java 代码中的错误 ** 的程序。它是免费软件
当前版本的 FindBugs 是 3.0.1
FindBugs 运行需要 1.7 或更高版本的 JRE(或 JDK)。但是,它可以分析从任何版本的 Java 编译的程序,从 1.0 到 1.8

以上是来自官网的介绍,核心内容为查找 Java 代码中的错误

IntelliJ IDEA 安装 FindBugs 插件

  • Ctrl+Alt+S 快捷键打开设置选项
  • 选择 Plugins
  • 点击底部 Browse repositories 按钮打开插件中心
  • 在输入框搜索 findbugs
  • 选择 FindBugs-IDEA
  • 此时右边红框位置会有一个绿色的 Install 按钮 (下面这张图是已经安装的情况), 点击安装即可, 安装完成后需要重启 IDEA
    IDEA 安装 FindBugs 插件

FindBugs-IDEA 插件使用介绍

  • Ctrl+Shift+A 快捷键打开 Find Action 搜索面板
  • 在搜索框输入 findbugs 进行搜索
  • 点击下方红框的 FindBugs-IDEA 即可打开插件面板
    打开 FindBugs 插件

    插件面板按钮说明
    FindBugs 面板
  1. 分析选中的 Java 文件
  2. 分析在光标所在的类
  3. 分析选中的包
  4. 分析选中的模块 (点击时会询问是否同时分析 test 包中的类)
  5. 分析整个项目 (点击时会询问是否同时分析 test 包中的类)
  6. 自定义分析的类
  7. 分析被修改的类 (搭配 SVN,Git 使用)
  8. 分析 changelist 中的类 (搭配 SVN,Git 使用)
  9. 停止分析
  10. 根据 BUG 类型分组
  11. 根据类分组
  12. 根据包分组
  13. 根据 BUG 严重级别分组

FindBugs-IDEA 插件使用示例

创建一个带有一些问题的类

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Random;

public class FindBugsDemo {

    private static final DateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");

    public static String yyyyMMddForMat(Date date) {
        return yyyyMMdd.format(date);
    }

    public static int getRanDom() {
        return new Random().nextInt();
    }

    public static int round(int num) {
        return Math.round(num);
    }

    public static void printMap(Map<?, ?> map) {
        if (map != null && map.size() > 0) {
            for (Object key : map.keySet()) {
                System.out.println("key--->" + key);
                System.out.println("value--->" + map.get(key));
            }
        }
    }

    public static String trimString(String str) {
        str.trim();
        return str;
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }

}

选中该类, 点击上面插件面板序号为 1 对应的按钮, 进行文件分析, 结果如下


测试代码分析结果

我们是使用 BUG 严重级别进行分组
分组类型对应如下 (红色编号)

  1. Of Concren 建议, 如果遵循能更好的完善代码
  2. Troubling 不好的, 可能会引发不良后果
  3. Scary 严重问题, 在某种情况下一定会出现问题
  4. Scariest 非常严重, 已经影响到当前程序功能
    可以按照严重级别倒序进行修复, 如果时间允许, 可以将 Of Concren 中的问题也一并修复

下面对具体提示的 BUG 进行分析 (黄色编号)
1.Random object created and used only once (Random 对象创建后只使用一次)

该方法每次运行都会创建一个新的 Random 对象, 执行一次后就会被回收. 但是在多线程情况获取随机数方法也能正常使用, 所以可以定义一个 Random 对象常量, 然后使用该常量对象进行方法调用. 能减少创建对象的性能开销

2.Class defines equals() and uses Object.hashCode() (覆写了 equals 方法但是没有覆写 hashCode 方法)

在 Set,Map 中会使用对象的 hashCode 方法, 如果覆写了 equals 方法但是没有覆写 hashCode 方法会导致在 Set,Map 对象中出现问题

3.Inefficient use of keySet iterator instead of entrySet iterator (keySet 迭代器低效, 应该使用 entrySet 进行替换)

如果需要获取 Map 中的 key 和 value, 使用 Map.entrySet() 方法返回 Set<Map.Entry<K, V>> 对象, 然后迭代该 Set, 在使用 Entry 对象获取 key 和 value 更为高效

4.Method ignores return value (方法忽略返回值)

String 对象是不可变的, 当调用 String.trim() 后, 是返回一个新的 String 对象, 不会对调用者的内容进行改动

5.int value cast to float and then passed to Math.round (将 int 值转换为 float,然后传递给 Math.round)

Math.round() 方法只接收 float 和 double 类型, 然后转换为 int 和 long 类型, 如果传递 int 类型, 会先将其转换为 float 类型, 然后再转换为 int 类型, 所以导致该操作返回值与参数内容一致

6.Call to static DateFormat (调用静态的 DateFormat 对象)

DateFormat 对象是线程不安全的, 如果多线程调用同一个 DateFormat 对象会导致结果异常

FindBugs 只是一款静态代码分析工具, 虽然分析大多数的问题, 但是如果希望编写更为健壮的程序, 还需进行更多的测试操作, 切不可认为 FindBugs 没有分析出问题便认为没有问题了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,226评论 25 707
  • 一、介绍 Findbugs,它是一个静态分析工具,它检查类或者jar文件,将字节码和一组缺陷模式进行对比以发现可能...
    _Justin阅读 9,206评论 2 19
  • 天津东丽区华明镇,是个工业区,毗邻自贸区,是世博示范镇,正因此从南方来到这个地方打工。冬天里的北方,雪是不化的,你...
    湛蓝黑眼圈凡徒阅读 476评论 0 1
  • 昨天写了第一篇,写作给我带来了什么后,我心里产生很多想法。 决定要写一个系列,作为梳理写作对我的意义。 今天的我想...
    梁超文阅读 261评论 7 2
  • 今天早上闹钟响起,感觉就是我刚睡下,特别困,特别困,一点也没有起床的动力,简直是起床的想法都没有,更别提去锻炼、跑...
    梁木纯阅读 222评论 7 3