1.FindBugs简介
FindBugs是一款 静态分析工具,检查程序潜在bug,在bug报告中快速定位到问题的代码上。
FindBugs 运行需要 1.7 或更高版本的 JRE(或 JDK),但是它可以分析从任何版本的 Java 编译的程序,从1.0 到 1.8
2.IntelliJ IDEA 安装 FindBugs 插件
先放出 FindBugs 插件下载资源链接:https://download.youkuaiyun.com/download/jintiaozhuang/10553937
安装截图1
安装截图2
安装好重启,在IEDA左下角会有标致的控制面板
3.FindBugs的使用详述
插件面板按钮说明
1 分析选中的 Java 文件
2 分析在光标所在的类
3 分析选中的包
4 分析选中的模块 (点击时会询问是否同时分析 test 包中的类)
5 分析整个项目 (点击时会询问是否同时分析 test 包中的类)
6 自定义分析的类
7 分析被修改的类 (搭配 SVN,Git 使用)
8 分析 changelist 中的类 (搭配 SVN,Git 使用)
9 停止分析
10 根据 BUG 类型分组
11 根据类分组
12 根据包分组
13 根据 BUG 严重级别分组
我们是使用 BUG 严重级别进行分组如下图
Of Concren 建议, 如果遵循能更好的完善代码
Troubling 不好的, 可能会引发不良后果
Scary 严重问题, 在某种情况下一定会出现问题
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 没有分析出问题便认为没有问题了
---------------------
以上原文:https://blog.youkuaiyun.com/jintiaozhuang/article/details/81129670
Dead store to local variable 未始用的变量