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()方法在效率和实现方式上不统一)

FindBugs工具常见问题的更多相关文章

  1. Netsharp平台工具常见问题(FAQ)

    1. 请问EntityId如何填? 回答:Netsharp中EntityId是经常需要输入的一个字段,因为Netsharp工具一般的源头是实体元数据,也就是一般常说的所谓模型驱动.所以很多工具都需要E ...

  2. idea工具常见问题汇总

    1.隐藏idea创建项目自带的文件及文件夹比如.iml和.idea文件夹 Settings→Editor→File Types 在下方的忽略文件和目录(Ignore files and folders ...

  3. 在Windows上安装「算法 第四版」组件

    这篇文档将向你介绍如何在Windows系统上安装本书将用到的Java开发环境,同时我们也提供了一个手把手的.使用我们提供的DrJava工具或者用命令行来创建.编译和运行你的第一个Java程序的手册,这 ...

  4. bug经验

    1.异常信息丢失导致定位问题困难. 2.findbugs工具 3.在某些if语句判断中return,可能会导致文件句柄无法关闭. 4.lastmodified()在win下和linux下的处理是不同的 ...

  5. Netsharp系列文章目录结构

    作者:秋时  转载须说明出处  Netsharp交流群:338963050(请有详细的请求说明) ->. 总体介绍 Netsharp总体介绍 一. Netsharp快速入门系列 Netsharp ...

  6. SpringBoot系列: Eclipse+Maven环境准备

    这个链接比我写得更全面, http://tengj.top/2018/01/01/maven/ =============================20190115补充: maven 的一些插件 ...

  7. 白盒测试实践项目(day5)

    在这几天的工作下,小组成员都基本完成了各自所负责的内容. 李建文同学完成提交了代码复审相关文档后,也经过小组的补充,彻底完成. 汪鸿同学使用FIndBugs工具完成了静态代码的测试,并且也完成了静态代 ...

  8. 白盒测试实践项目(day1)

    由于近期各种考试逼近,我们小组白盒测试实践项目进度有些慢,在任务决定后的两天里,我们小组各个成员的进度完成不一. 胡俊辉熟悉了怎么使用Junit对部分代码的测试,初步掌握了Junit的简单使用. 汪鸿 ...

  9. windows系统IO性能测试

    关键词:sql server io测试 下载链接:http://www.onlinedown.net/soft/57364.htm CrystalDiskMark(硬盘检测工具),一个测试你的硬盘或者 ...

随机推荐

  1. 河南省第六届ACM程序设计大赛

    C:  最舒适的路线 (并查集) #include<cstdio> #include<cstring> #include<iostream> #include< ...

  2. C2第四次作业解题报告

    看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.h ...

  3. [Xamarin] 透過WebClient跟網路取得資料 (转帖)

    之前寫過一篇文章,關於在Android上面取得資料 透過GET方式傳資料給Server(含解決中文編碼問題) 我們來回顧一下 Android 端的Code: 有沒有超多,如果是在Xaramin下面,真 ...

  4. (转)SpringSecurity扩展User类,获取Session

    1.在session中取得spring security的登录用户名如下 ${session.SPRING_SECURITY_CONTEXT.authentication.principal.user ...

  5. RabbitMQ(一) -- Hello world

    RabbitMQ -- Hello world RabbitMQ使用AMQP通信协议(AMQP是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同 ...

  6. 原生JavaScript事件详解

    JQuery这种Write Less Do More的框架,用多了难免会对原生js眼高手低. 小菜其实不想写这篇博客,貌似很初级的样子,但是看到网络上连原生js事件绑定和解除都说不明白,还是决定科普一 ...

  7. C# 通过SerialPort简单调用串口

    问题 最近比较经常使用串口进行发送以及传输数据,但是笔者在刚开始接触SerialPort类时,对于Write之后去Read数据的时候,由于设备上面还没有返回数据,读取到的只能是空值.然而,再进行下一次 ...

  8. paip.提升性能---协程“微线程”的使用.

    paip.提升性能---协程的使用. 近乎无限并发的"微线程" 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:h ...

  9. atitit.404错误的排查流程总结vOa6

    atitit.404错误的排查流程总结vOa6 1. 场景 1 1.1. 子应用猛个腊擦不能使用  404 兰.. 1 2. 服务器配置问题 2 2.1. 登录服务器管理子应用,查看应用是否启动okk ...

  10. css3过渡transition

    过渡:transition transition:transition-property/duration/timing-function/delay的缩写. transition : <'tr ...