IntelliJ IDEA 安装使用 FindBugs 代码分析详述

    项目越来越大,开发人员越来越多代,码审查工作会变得越来越复杂,对代码质量控制难度也与日俱增,尽管经验丰富的程序员能审查能检查出大部分问题,但也得耗费巨大的人力成本,并且大多数大家工作都比较饱和,并不是每天都能坚持提交代码到GIT库前都能进行审查、所以我们可以通过一些必要的检查工具来去发现程序潜在的bug,便于我们进一步定位,尽管工具的不能解决大部分问题,但是也是能够给我们带来很大的帮助。

1.FindBugs简介

FindBugs是一款 静态分析工具,检查程序潜在bug,在bug报告中快速定位到问题的代码上。

FindBugs 运行需要 1.7 或更高版本的 JRE(或 JDK),但是它可以分析从任何版本的 Java 编译的程序,从1.0 到 1.8

2.IntelliJ IDEA 安装 FindBugs 插件

先放出 FindBugs 插件下载资源链接:https://download.csdn.net/download/jintiaozhuang/10553937

安装截图1

IntelliJ IDEA 安装使用 FindBugs 代码分析详述_第1张图片

安装截图2

IntelliJ IDEA 安装使用 FindBugs 代码分析详述_第2张图片

安装好重启,在IEDA左下角会有标致的控制面板

3.FindBugs的使用详述

插件面板按钮说明

IntelliJ IDEA 安装使用 FindBugs 代码分析详述_第3张图片

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

我们是使用 BUG 严重级别进行分组如下图

IntelliJ IDEA 安装使用 FindBugs 代码分析详述_第4张图片

  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> 对象, 然后迭代该 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 没有分析出问题便认为没有问题了

 

 

 

 

你可能感兴趣的:(开发工具)