FindBugs工具常见问题

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

时间: 2024-10-10 06:36:12

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

webpack构建工具常见问题及解决方法

webpack构建工具常见问题及解决方法 在运用webpack开发项目的时候经常会遇到各种各样的问题,我对实际开发项目中实际遇到的一些问题 进行总结,希望能帮助到大家. ?? 1. 构建需要的包未添加依赖报错 Module not found:"xxx(例:react)" in "项目文件" ??这种情况是由于"xxx(例:react)"未添加依赖,解决办法如下: npm install xxx(react) --save 或 yarn add

开源工具Findbugs使用总结

一.代码检查法概念 白盒测试分为静态测试和动态测试. 代码检查法是静态测试的一种,主要是由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行. 代码检查包括代码走查.桌面检查.代码审查等,主要检查代码和设计的一致性,代码对标准的遵循.可读性,代码的逻辑表达的正确性,代码结构的合理性等方面:可以发现违背程序编写标准的问题,程序中不安全.不明确和模糊的部分,找出程序中不可移植部分.违背程序编程风格的问题,包括变量检查.命名和类型审查.程序逻辑审查.程序语法检查和程序结构检查等内容. 二.

Android Lint工具

Android lint是在ADT 16提供的新工具,它是一个代码扫描工具,类似findBugs工具.不过他主要检测以下方面的内容: 布局性能 国际化问题(硬编码) 图标的问题(重复的图标,错误的大小) 可用性问题(如不指定的文本字段的输入型) Androidmanifest文件的错误 未使用到图片等资源 不一致的数组大小 使用了高于minSdk的api 可以直接检测某个工程,使用方式很简单,配置好sdk路径,命令行中直接输入:lint 工程名 就会有检测结果,例如下图: 在Eclipse中他已

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

这篇文档将向你介绍如何在Windows系统上安装本书将用到的Java开发环境,同时我们也提供了一个手把手的.使用我们提供的DrJava工具或者用命令行来创建.编译和运行你的第一个Java程序的手册,这个过程中用到的所有软件都可以自由下载 本操作指南适用于32位和64位的Windows 8.Windows 7.Vista SP1和XP SP3 —————— 0. 安装开发环境 —————— 我们提供的安装器将会自动下载.安装和配置你将用到的所有开发环境,包括Java SE 7.DrJava.教材库

了解Java Class文件结构

我们都知道Java文件经过编译后是一个二进制的class文件,但多数情况下我们更了解Java语法,它能帮助我们编写漂亮的代码,但知道Java更底层的东西我们就能写出更高效的代码.在研究findbugs工具时,由于其使用BCEL来处理class文件,这就要求我们对class文件的基本结构有一定的了解.这里纯粹是记录我在学习class文件结构的一些总结,要更系统深入的学习可以查看官方文档The Java Virtual Machine Specification. class文件是有8个字节为基础的

借助BCEL

BCEL是一个java字节码引擎库,有了他我们可以方便的表示出class文件的数据,另外BCEL还支持动态的创建和改变java class文件.这里我仅是初略的了解BCEL解释class文件的功能,为我后面学习FindBugs工具做准备,需要深入学习BCEL的创建.改变class文件的功能,可以查看官方文档. 这是org.apache.bcel.classfile包下的类,可以看到这些类展示了class文件所有的数据结构,JavaClass是一个java class文件的抽象,他可以通过Clas

静态代码检查报告

今天在下面刊载一篇小王同学写的静态代码检查报告,图文并茂,条理清晰. 1. 工具说明 FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析.不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式.Findbugs可以在多个环境中运行,同时也可以编写自己的检测器,功能比较完善.我们平时可以收集自己的或者是别人的开发经验,把它做成检测器来完善Findb

白盒测试每日例会记录(7)

FindBugs工具使用运行: 点击FindBugs下的Find Bugs选项,即可开始运行FindBugs工具.其运行中的过程如图所示. 对应的显示框中也显示出了其找到的Bug.如图所示. 双击这个即可迅速定位到对应的位置.

通什翡翠商城邮件群发

用一种新的技术思维去群发邮件一种不用换IP,不需要任何发件箱的邮件群发方式一种不需要验证码,不需要**代码变量的邮件群发方式即使需要验证码也能全自动识别验证码的超级智能软件教你最核心的邮件群发思维和软件群发技术图片链接不是问题50%~90%进入收件箱让你不再为进垃圾箱而发愁每天群发100万封邮件不再是难题懒人技术升级版大站协议邮件群发提供的不仅仅是软件更重要的是群发技术 邮件群发神器简介:什么是通什翡翠商城大站协议邮件群发系统?通什翡翠商城大站协议邮件群发系统,是通过设置邮件群发的网页模拟组数据