1,AM: Creates an empty jar file entry (AM_CREATES_EMPTY_JAR_FILE_ENTRY)/AM: Creates an empty zip file entry (AM_CREATES_EMPTY_ZIP_FILE_ENTRY)

示例代码:

ZipEntry entry = new ZipEntry(PATH);

zos.putNextEntry(entry);

zos.closeEntry();

原因:

代码中在调用putNextEntry()之后紧接着调用了closeEntry()函数,致使该jar文件内容为空,因为打jar包的写内容是在putNextEntry()和closeEntry()两个函数调用之间来进行的。(有时候也许会有意的构建一个空目录,因此不一定就是bug)

2,BC: Equals method should not assume anything about the type of its argument (BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS)

示例代码:

public class Foo {

// some code

public void equals(Object o) {

Foo other = (Foo) o;

// the real equals code

}

}

原因:

当你在实现类的equals方法时,不应该对参数有任何的预先设定。如上代码所写,则设定了参数o肯定是Foo类的一个对象.但是如果在函数调用时,参数o不是一个Foo类或其子类,就会导致代码会抛出一个ClassCastException。因此在实现equals方法,应该加一个判断,如果参数o不是一个Foo类对象,则返回false。

3,BC: Random object created and used only once (DMI_RANDOM_USED_ONLY_ONCE)

示例代码:

public int getRandom(int seed) {

return new Random(seed).nextInt();

}

原因:

由于java.util.Random是一个伪随机函数,如果传入的seed值相同的话,返回的随机数者是相同的 。因此没必要每次都new一个新的random出来计算随机数。如果你想真正地获得一个不可预知的随机数,建议使用java.security.SecureRandom,该类继承自Random,是一个强随机数生成器 。因此上述代码可以修改为:

public class Test  extends Thread{

private SecureRandom ran;

Test(int seed){

ran = new SecureRandom();

}

public int getRandom(int seed) {

return ran.nextInt();

}

}

4,CN: Class implements Cloneable but does not define or use clone method (CN_IDIOM)

示例代码:

public class Foo implements Cloneable {

public Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

原因:

类定义要实现了 Cloneable接口,却没有定义或使用 clone方法,即缺少红色字体部分。

5,CN: clone method does not call super.clone() (CN_IDIOM_NO_SUPER_CALL)

示例代码:

public class Foo implements Cloneable {

public Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

原因:

clone方法没有调用super.clone()方法,如果没有调用,则会导致对象父子层级关系不能正确建立,最终导致无法正确组装对象。

6,CN: Class defines clone() but doesn't implement Cloneable (CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE)

示例代码:

public class Foo{

public Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

原因:

这个用法的意义在于你可以规范该类的子类的clone的实现,如果你的确想这样做的话,这不是一个bug,否则的话是一个bug

7,DE: Method might drop exception (DE_MIGHT_DROP)/DE: Method might ignore exception (DE_MIGHT_IGNORE)

示例代码:

try{}catch(Exception ex){}

原因:

方法有可能抛异常或者忽略异常,需要对异常进行处理,即需要在catch体中对异常进行处理。

8,DMI: Don't use removeAll to clear a collection (DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION)

原因:

建议不要使用 collection.removeAll(collection)方法来删除 collection中的所有元素,而使用collection.clear()。比较二者的代码实现就可以看出:

removeAll()源码:

public boolean removeAll(Collection<?> c) {

boolean modified = false;

Iterator<?> e = iterator();

while (e.hasNext()) {

if (c.contains(e.next())) {

e.remove();

modified = true;

}

}

return modified;

}

clear()源码:

public void clear() {

Iterator<E> e = iterator();

while (e.hasNext()) {

e.next();

e.remove();

}

}

前者是比较参数中的collection和要移除元素的collection中是否有交集,然后将交集元素删除;后者是直接将collenction中的元素删除。显然后者要比前者高效,而且对于某些特殊的collenction还容易抛出一些异常,如ConcurrentModificationException

9,ES: Comparison of String parameter using == or != (ES_COMPARING_PARAMETER_STRING_WITH_EQ)

原因:当比较两个字符串内容是否相同时,仅当两个字符串在源文件中都是常量时或者是使用intern()来比较才可以用==来比较,否则最好使用对象比较方法equal。附string比较:

String str1 = "java";

String str2 = "java";

System.out.print(str1==str2);

结果:true(二者都为常量)

String str1 = new String("java");

String str2 = new String("java");

System.out.print(str1==str2);

结果:false(二者为对象)

String str1 = "java";

String str2 = "blog";

String s = str1+str2;

System.out.print(s=="javablog");

结果:false(s不为常量,为对象)

String s1 = "java";

String s2 = new String("java");

System.out.print(s1.intern()==s2.intern());

结果:true(但是intern()方法在效率和实现方式上不统一)

转载于:https://www.cnblogs.com/happyPawpaw/p/4227697.html

FindBugs工具常见问题相关推荐

  1. 转载:数学工具常见问题集

      首页  |  信息资讯  |  个人文集  |  资源检索  |  浏览精彩论坛   设为首页 收藏本站 站点导航    近期活动  气象资料  专业绘图  算法模式  高性能计算  网格技术   ...

  2. Auto病毒专杀工具常见问题

    Auto病毒专杀工具常见问题 Auto病毒专杀工具常见问题 为什么格式化U盘之后还是有毒? 因为你的电脑已经中毒,即使格式化U盘,病毒也会自动在U盘内生成病毒.可以使用Auto病毒专杀查杀内存中的病毒 ...

  3. DOTA无法加载服务器指定的地图,Dota2自定义地图工具怎么安装_Dota2自定义地图工具常见问题处理方法...

    Dota 2 创意工坊工具的早期测试(Alpha)版本已经发布,如果你有新奇的想法可以使用工具开发制作自己的地图,为Dota 2再添砖瓦. 如果是抱着"玩"的心态小编建议就不要下载 ...

  4. SOLIDWORKS 钣金成型工具常见问题

    在SOLIDWORKS钣金设计中,SOLIDWORKS成形工具的使用必不可少,SOLIDWORKS成形工具是可以用作折弯.伸展或成形钣金的冲模的零件,能够生成一些成形特征,例如百叶窗.法兰和筋特征,那 ...

  5. Findbugs工具的使用

    版权声明:本文为博主原创文章,未经小马哥允许不得转载. https://blog.csdn.net/m765201832/article/details/72754657 原文地址:https://b ...

  6. pb反编译工具 常见问题集

    如何使用PB反编译工具? Step1:open file 第一步:开启文件 Step2:Export PBL 第二步:导出PBL Step3: Export PBW & PBT 第三步:导出P ...

  7. komodo edit 支持java么_Komodo Edit Mac版-Komodo Edit for Mac(多语言集成开发工具)v12.0.1(91869)官方版...

    想要一款多种语言的开发工具吗?试试Komodo Edit for Mac吧!Komodo Edit Mac版是一款运行在MacOS系统上的多语言集成开发工具.Komodo Edit目前支持在Windo ...

  8. mnn 编译转换工具 win10 2021

    2021.0824更新,mnn1.2.0 编译ok python版转换工具: python -m MNN.tools.mnnconvert 这个不是最新版,1.1.4,目前最新版是1.2.0 nmak ...

  9. Jenkins 在 Tomcat 中的部署及代码静态检查工具集成

    Jenkins 的简单部署 在安装了 Jenkins 运行所需的依赖(主要是 JDK)之后,可以通过如下步骤简单快速地部署 Jenkins: 下载 Jenkins. 打开终端并切换至下载目录. 运行命 ...

最新文章

  1. 一道笔试题--求二进制数1的个数
  2. 【搬砖】【Python数据分析】Pycharm中plot绘图不能显示出来
  3. HDU 3397 Sequence operation
  4. Kafka解析之失效副本
  5. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)
  6. 关系数据库——sql增删改
  7. 谁说产品经理和程序员之间不能和平共处?
  8. day023 常用模块02
  9. Mac使用minicom串口工具
  10. 计算机读研云计算,快来看看2022云计算考研专业有哪些?
  11. mac mysql 没有my.cnf_mac下mysql配置my.cnf无效
  12. 《Linux内核设计与实现》勘误
  13. 嵌入式学习笔记7——LCD1602液晶屏
  14. 图像学习一:图像的旋转
  15. 2019高考(高中)数学必背重点公式大全
  16. I3D泛读【Que Vadis,Action Recognition?A New Model and the Kinetics Dataset】
  17. Mac百度云盘不限速操作步骤
  18. STC8单片机OLED通过SPI硬件中断方式驱动——优化
  19. 手动搭建高可用的Redis5.0分片集群,从理论到实践,超详细
  20. 基础(待续)-弹群协同作战

热门文章

  1. linux筛选之后备份到命令,linux find 命令使用备份
  2. java gui 读取文件夹_java Swing GUI 入门-文件读写器
  3. linux+bbu电池模块,服务器Raid卡电池自动充电
  4. keras faster物体检测_URPC 2019水下目标检测竞赛冠军方案:多图像融合增强
  5. 【收藏】Linux系统常用命令速查手册(附赠PDF档)
  6. 你真的了解防火墙吗?
  7. 怎么利用css调整区块大小,使用CSS3 transform:skew方法实现的倾斜区块分割
  8. c语言cnn实现ocr字符,端到端的OCR:基于CNN的实现
  9. linux java aptget_apt-get没有安装任何linux服务器
  10. java stream 多个filter_恕我直言你可能真的不会java第3篇:Stream的Filter与谓词逻辑...