目前已转至个人博客,本系列地址: Lam's Blog - Knowledge as Action
Creates an empty jar file entry
调用putNextEntry()方法写入新的 jar 文件条目时立即调用closeEntry()方法。这样会造成JarFile条目为空。
Creates an empty zip file entry
调用putNextEntry()方法写入新的 zip 文件条目时立即调用closeEntry()方法。这样会造成ZipFile条目为空。
Equals method should not assume anything about the type of its argument
equals(Object o)方法不能对参数o的类型做任何的假设。比较此对象迅中与指定的对象。当且仅当该参数不为裤铅 null,并且是表示与此对象相同的类型的对象时,结果才为 true。
Random object created and used only once
随机创建对象只使用过一次就抛弃
Check for sign of bitwise operation
检查位 *** 作符运行是否合理
Class implements Cloneable but does not define or use clone method
类实现了Cloneable接口,但是没有定义或使用clone方法。按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的),以获得有关重写此方法的详细信息。
clone method does not call super.clone()
一个非final类型的类定义了clone()方法而没有调用super.clone()方法。例如:B扩展自A,如果B中clone方法调用了spuer.clone(),而A中的clone没有调用spuer.clone(),就会造成结果类型不准确。要求A的clone方法中调用spuer.clone()方法。
Class defines clone() but doesn't implement Cloneable
类中定义了clone方胡昌好法但是它没有实现Cloneable接口
Abstract class defines covariant compareTo() method
抽象类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型
Covariant compareTo() method defined
类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型
Method might drop exception
方法可能抛出异常
Method might ignore exception
方法可能忽略异常
Don't use removeAll to clear a collection
不要用removeAll方法去clear一个集合
Classloaders should only be created inside doPrivileged block
类加载器只能建立在特殊的方法体内
Method invokes System.exit(...)
在方法中调用System.exit(...)语句,考虑用RuntimeException来代替
Method invokes dangerous method runFinalizersOnExit
在方法中调用了System.runFinalizersOnExit 或者Runtime.runFinalizersOnExit方法,因为这样做是很危险的。
Comparison of String parameter using == or !=
用==或者!=方法去比较String类型的参数
Abstract class defines covariant equals() method
抽象类定义了共变的compareTo()方法
Equals checks for noncompatible operand
equals方法检查不一致的 *** 作。两个类根本就是父子关系而去调用equals方法去判读对象是否相等。
Class defines compareTo(...) and uses Object.equals()
类定义了compareTo(...)方法,却使用Object.equals()方法
equals method fails for subtypes
类中的equals方法可能被子类中的方法所破坏,当使用类似于Foo.class == o.getClass()的判断时考虑用this.getClass() == o.getClass()来替换
Covariant equals() method defined
类中定义了多个equals方法。正确的做法是覆写Object中的equals方法,它的参数为Object类型的对象。
Empty finalizer should be deleted
应当删除空的finalize()方法
Unchecked type in generic call
泛型调用中使用了未检查的类型
Class defines equals() but not hashCode()
方法定义了equals方法却没有定义hashCode方法
Class defines hashCode() but not equals()
类定义了hashCode方法去没有定义equal方法
Class defines equals() and uses Object.hashCode()
一个类覆写了equals方法,没有覆写hashCode方法,使用了Object对象的hashCode方法
Class inherits equals() and uses Object.hashCode()
子类继承了父类的equals方法却使用了Object的hashCode方法
Superclass uses subclass during initialization
子类在父类未初始化之前使用父类对象实例
Dubious catching of IllegalMonitorStateException
可疑的IllegalMonitorStateException异常捕捉
Needless instantiation of class that only supplies static methods
为使用静态方法而创建一个实例对象。调用静态方法时只需要使用类名+静态方法名就可以了。
Iterator next() method can't throw NoSuchElementException
迭代器的next方法不能够抛出NoSuchElementException
Store of non serializable object into HttpSession
在HttpSession对象中保存非连续的对象
Fields of immutable classes should be final
不可变类的字段应当是final的
Method with Boolean return type returns explicit null
返回值为boolean类型的方法直接返回null,这样会导致空指针异常
equals() method does not check for null argument
变量调用equals方法时没有进行是否为null的判断
toString method may return null
toString方法可能返回null
Class names should start with an upper case letter
类的名称以大写字母名称开头
Class is not derived from an Exception, even though it is named as such
类的名称中含有Exception但是却不是一个异常类的子类,这种名称会造成混淆
Confusing method names
令人迷惑的方法命名
Field names should start with a lower case letter
非final类型的字段需要遵循驼峰命名原则
Use of identifier that is a keyword in later versions of Java
验证是否是java预留关键字
Use of identifier that is a keyword in later versions of Java
验证是否时java中的关键字
Method names should start with a lower case letter
方法名称以小写字母开头
Class names shouldn't shadow simple name of implemented interface
实现同一接口实现类不能使用相同的名称,即使它们位于不同的包中
Class names shouldn't shadow simple name of superclass
继承同一父类的子类不能使用相同的名称,即使它们位于不同的包中
Very confusing method names (but perhaps intentional)
很容易混淆的方法命名,例如方法的名称使用大小写来区别两个不同的方法。
Method doesn't override method in superclass due to wrong package for parameter
由于错误引用了不同包中相同类名的对象而不能够正确的覆写父类中的方法
Method may fail to close database resource
方法中可能存在关闭数据连接失败的情况
Method may fail to close stream
方法中可能存在关闭流失败的情况
Method may fail to close stream on exception
方法中可能存在关闭流时出现异常情况
Suspicious reference comparison to constant
当两者为不同类型的对象时使用equals方法来比较它们的值是否相等,而不是使用==方法。例如比较的两者为java.lang.Integer, java.lang.Float
Method ignores results of InputStream.read()
InputStream.read方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。
Method ignores results of InputStream.skip()
InputStream.skip()方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户跳过少量字符请求的情况
Method ignores exceptional return value
方法忽略返回值的异常信息
Static initializer creates instance before all static final fields assigned
在所有的static final字段赋值之前去使用静态初始化的方法创建一个类的实例。
Non-serializable value stored into instance field of a serializable class
非序列化的值保存在声明为序列化的的非序列化字段中
Comparator doesn't implement Serializable
Comparator接口没有实现Serializable接口
Serializable inner class
序列化内部类
serialVersionUID isn't final
serialVersionUID不是final的
Class is Serializable but its superclass doesn't define a void constructor
子类序列化时父类没有提供一个void的构造函数
Class is Externalizable but doesn't define a void constructor
Externalizable 实例类没有定义一个void类型的构造函数
The readResolve method must be declared with a return type of Object.
readResolve从流中读取类的一个实例,此方法必须声明返回一个Object类型的对象
Transient field that isn't set by deserialization.
不需要被反序列化的字段没有声明transient
Class is Serializable, but doesn't define serialVersionUID
一个类实现了Serializable接口但是没有定义serialVersionUID类型的变量。序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID
Usage of GetResource may be unsafe if class is extended
当一个类被子类继承后不要使用this.getClass().getResource(...)来获取资源
FindBugs:简介与使用
FindBugs 规则整理:CORRECTNESS
FindBugs 规则整理:Style &Dodgy
FindBugs 规则整理:Malicious Code Vulnerability
FindBugs 规则整理:Multithreaded Correctness
FindBugs 规则整理:Security &Experimental
FindBugs 规则整理:Performance
FindBugs 规则整理:Internationalization
整合以下文章过程中发现部分存在翻译错误,已做修正,同时感谢以下文章作者
FindBugs使用备忘录
FindBugs规则整理
详解FindBugs的各项检测器
Findbugs 缺陷详解与英文代号的对照表
FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定祥弯程序的意图,而是通常使用 Visitor 模式(请参阅 参考资料)。图 1 显示了分析一个匿名项目的结果(为防止可怕的犯罪,这里不给出它的名字):在FindBugs的GUI中,需要先选择待扫描的.class文件(FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。)。如果你拥有这些.class档对应的源文件,可把这些.java文件再选上大埋,这样便可以从稍后得出的报告中快捷的定位到出问题的代码上面。此外,还可以选上工程所使用的library,这样似乎可以帮助FindBugs做一些高阶的检查,藉以发现一些更深层的bug。
选定了以上各项后,滚宴蚂便可以开始检测了。检测的过程可能会花好几分钟,具体视工程的规模而定。检测完毕可生成一份详细的报告,藉由这份报告,可以发现许多代码中间潜在的bug。比较典型的,如引用了空指针(null pointer dereference), 特定的资源(db connection)未关闭,等等。如果用人工检查的方式,这些bug可能很难才会被发现,或许永远也无法发现,直到运行时发作…当除掉了这些典型的(classic) bug后,可以确信的是,我们的系统稳定度将会上一个新的台阶。
所有的这些新的工具使得确保代码质量比以前简单得多,不过您还需要知道如何使用它们。 代码度量 “监视圈复杂度”展示如何使用简单的代码度量工具和基于 Java 的工具来监视代码复杂度。 “软件架构的代码质量”解释了如何持续地仿宏咐监视并纠正会影响软件架构的长期生存能力的代码质量方面。 “用代码度量进行重构”介绍如何使用相同的代码度量方法和提取方法模式进行有针对性的重构。 静态分析工具 静态分析工具承诺无需开发人员费劲就能找出绝颤代码中已有的缺陷。当然,如果有多年的编写经验,就会知道这些承诺并不是一定能兑现。尽管如此,好的静态分析工具仍然是工具箱中的无价之宝: FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题: “FindBugs,第 1 部分”和“第 2 部分”备纯分别介绍使用 FindBugs 的原因和方法以及如何编写自定义检测器以查找特定于应用程序的问题。 “消除 bug”展示了这个静态分析工具如何帮助分析代码。 “平衡测试,第 1 部分、第 2 部分 和第 3 部分”讨论如何通过引进 FindBugs 静态代码分析工具来改进管理软件质量的方式。 PMD 是一个开源的静态分析工具,它分析 Java 源代码,并找出潜在的 bug: “用 PMD 铲除 bug”解释如何使用 PMD 内置的规则以及您自己定制的规则集来提高 Java 代码质量。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)