| Description | Category |
|---|---|
| BC: Equals method should not assume anything about the type of its argument | Bad practice |
| BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS|说明:Equals (Object o)方法不应该对 o 的类型做任何假设。如果 o 不是这个类型,那么它应该返回 false。 | |
| BIT: Check for sign of bitwise operation | Bad practice |
| BIT_SIGNED_CHECK|检查代码中是否有带符号的位运算,例如:((event.detail & SWT.SELECTED) > 0) 使用位算术然后与大于运算符进行比较可能会导致意外的结果(当然取决于 SWT.SELECTED 的值)。如果 SWT.SELECTED 是一个负数,则这是一个 bug 的候选值。即使 SWT.SELECTED 不是否定的,使用它似乎也是一个很好的习惯 ’!= 0’ 而不是’> 0’。 | |
| CN: Class implements Cloneable but does not define or use clone method | Bad practice |
| CN_IDIOM|类实现了Cloneable接口,但是没有定义或使用clone方法。按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的),以获得有关重写此方法的详细信息。 | |
| CN: clone method does not call super.clone() | Bad practice |
| CN_IDIOM_NO_SUPER_CALL|一个非final类型的类定义了clone()方法而没有调用super.clone()方法。例如:B扩展自A,如果B中clone方法调用了spuer.clone(),而A中的clone没有调用spuer.clone(),就会造成结果类型不准确。要求A的clone方法中调用spuer.clone()方法。 | |
| CN: Class defines clone() but doesn't implement Cloneable | Bad practice |
| CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE|类中定义了clone方法但是它没有实现Cloneable接口 | |
| CNT: Rough value of known constant found | Bad practice |
| CNT_ROUGH_CONSTANT_VALUE|建议使用预定义的库常量以提高代码的清晰度和精确度 | |
| Co: Abstract class defines covariant compareTo() method | Bad practice |
| CO_ABSTRACT_SELF|抽象类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型,如下例:int compareTo(T o) 比较此对象与指定对象的顺序。 | |
| Co: compareTo()/compare() incorrectly handles float or double value | Bad practice |
| CO_COMPARETO_INCORRECT_FLOATING|不正确地处理 float 或 double value,该方法使用如下模式比较 double 或 float 值: val1 > val2?1: val1 < val2?- 1:0.对于-0.0和 NaN 值,此模式工作不正确,这可能导致排序结果不正确或集合中断(如果将比较值用作键)。考虑使用 Double.compare 或者 Float.compare 静态方法来正确处理所有的特殊情况。 | |
| Co: compareTo()/compare() returns Integer.MIN_VALUE | Bad practice |
| CO_COMPARETO_RESULTS_MIN_VALUE|在某些情况下,compareTo 或 compare 方法返回常量 Integer.MIN_VALUE,这是一个非常糟糕的实践。关于 compareTo 的返回值,唯一重要的是结果的符号。但人们有时会否定 compareTo 的返回值,期望这会否定结果的符号。除非返回的值是 Integer.MIN_VALUE,否则它将是。所以只需返回 -1而不是 Integer.MIN_VALUE。 | |
| Co: Covariant compareTo() method defined | Bad practice |
| CO_SELF_NO_OBJECT|类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型 | |
| DE: Method might drop exception | Bad practice |
| DE_MIGHT_DROP|此方法可能会删除异常。通常,应该以某种方式处理或报告异常,或者应该将它们从方法中抛出。 | |
| DE: Method might ignore exception | Bad practice |
| DE_MIGHT_IGNORE|此方法可能会忽略异常。通常,应该以某种方式处理或报告异常,或者应该将它们从方法中抛出。 | |
| DMI: Adding elements of an entry set may fail due to reuse of Entry objects | Bad practice |
| DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS|由于重用Entry对象,向一个Entry集合添加元素可能会失败,允许 entrySet ()方法返回基础 Map 的视图,其中在迭代期间重用并返回单个 Entry 对象。在 Java 1.6中,IdentityHashMap 和 EnumMap 都是这样做的。在遍历这样一个 Map 时,Entry 值仅在进入下一个迭代之前有效。例如,如果您尝试将 entrySet 传递给 addAll 方法,则会出现严重错误。 | |
| DMI: Random object created and used only once | Bad practice |
| DMI_RANDOM_USED_ONLY_ONCE|随机创建对象只使用过一次就抛弃,此代码创建一个 java.util.Random 对象,使用它生成一个随机数,然后丢弃该 Random 对象。这会产生中等质量的随机数并且效率低下。如果可能,重写代码,以便 Random 对象创建一次并保存,并且每次需要一个新的随机数时调用现有 Random 对象的方法来获取它。如果生成的随机数不可猜测很重要,则不得为每个随机数创建新的随机数;这些值太容易猜到了。您应该强烈考虑改用 java.security.SecureRandom(并避免为每个所需的随机数分配一个新的 SecureRandom | |
| DMI: Don't use removeAll to clear a collection | Bad practice |
| DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION|不要使用 removeAll 清除集合,如果要从集合 c 中移除所有元素,请使用 c.clear,而不是 c.removeAll (c)。调用 c.removeAll (c)来清除集合不太清楚,容易出错,效率较低,对于某些集合,可能会抛出 ConcurrentModificationException。 | |
| Dm: Method invokes System.exit(...) | Bad practice |
| DM_EXIT|Exit 的调用将关闭整个 Java 虚拟机。只有在适当的时候才应该这样做。这样的调用使您的代码很难或不可能被其他代码调用。考虑抛出一个 RuntimeException。 | |
| Dm: Method invokes dangerous method runFinalizersOnExit | Bad practice |
| DM_RUN_FINALIZERS_ON_EXIT|不要因为任何原因调用 System.runFinalizersOnExit 或 Runtime.runFinalizersOnExit: 它们是 Java 库中最危险的方法之一。 | |
| ES: Comparison of String parameter using == or != | Bad practice |
| ES_COMPARING_PARAMETER_STRING_WITH_EQ|不要使用== 或 != 运算符比较 java.lang.String,使用equals | |
| ES: Comparison of String objects using == or != | Bad practice |
| ES_COMPARING_STRINGS_WITH_EQ|不要使用== 或 != 运算符比较,使用equals | |
| Eq: Abstract class defines covariant equals() method | Bad practice |
| EQ_ABSTRACT_SELF|这个类定义了equals()方法,但是参数却是Object的子类。正确覆盖equals()方法,参数必须是Object | |
| Eq: Equals checks for incompatible operand | Bad practice |
| EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS|equals方法检查不一致的操作。两个类根本就是父子关系而去调用equals方法去判读对象是否相等。 | |
| Eq: Class defines compareTo(...) and uses Object.equals() | Bad practice |
| EQ_COMPARETO_USE_OBJECT_EQUALS|若要修复 FindBugs 检查,请重写 equals 和 hashCode,如果通常情况下这样做是有意义的话(或者排除使用建议的注释对该类和文档违反此条件的检查) | |
| Eq: equals method fails for subtypes | Bad practice |
| EQ_GETCLASS_AND_CLASS_CONSTANT|类中的equals方法可能被子类中的方法所破坏,当使用类似于Foo.class == o.getClass()的判断时考虑用this.getClass() == o.getClass()来替换 | |
| Eq: Covariant equals() method defined | Bad practice |
| EQ_SELF_NO_OBJECT|类中定义了多个equals方法。正确的做法是覆写Object中的equals方法,它的参数为Object类型的对象。 | |
| FI: Empty finalizer should be deleted | Bad practice |
| FI_EMPTY|为空的finalizer方法应该删除 | |
| FI: Explicit invocation of finalizer | Bad practice |
| FI_EXPLICIT_INVOCATION|此方法包含对对象的 finalize ()方法的显式调用。因为finalizer方法应该只执行一次,而且只能由 VM 执行,所以这是一个坏主意,如果一组连接的对象是可终结的,那么 VM 将在所有可终结的对象上调用 finalize 方法,可能同时在不同的线程中调用。因此,在类 x 的 finalize 方法中,对 x 引用的对象调用 finalize 是一个特别糟糕的主意,因为它们可能已经在单独的线程中完成了 | |
| FI: Finalizer nulls fields | Bad practice |
| FI_FINALIZER_NULLS_FIELDS|此终结器使字段空值。这通常是一个错误,因为它无助于垃圾收集,而且无论如何对象都将被垃圾收集。 | |
| FI: Finalizer only nulls fields | Bad practice |
| FI_FINALIZER_ONLY_NULLS_FIELDS|这个终结器除了空字段外什么都不做。这是完全没有意义的,需要对对象进行垃圾收集、终结,然后再次进行垃圾收集。您应该只删除 finalize 方法。 | |
| FI: Finalizer does not call superclass finalizer | Bad practice |
| FI_MISSING_SUPER_CALL|这个 finalize ()方法不调用其超类的 finalize ()方法。因此,不会执行为超类定义的任何终结器操作。添加对 super.finalize ()的调用。 | |
| FI: Finalizer nullifies superclass finalizer | Bad practice |
| FI_NULLIFY_SUPER|这个空 finalize ()方法显式地否定由其超类定义的任何终结器的效果。不会执行为超类定义的任何终结器操作。除非有此意图,否则请删除此方法 | |
| FI: Finalizer does nothing but call superclass finalizer | Bad practice |
| FI_USELESS|这个 finalize ()方法所做的唯一一件事就是调用超类的 finalize ()方法,使其成为冗余。 | |
| FS: Format string should use %n rather than \n | Bad practice |
| VA_FORMAT_STRING_USES_NEWLINE|格式化字符串应该使用 %n 而不是 \n | |
| GC: Unchecked type in generic call | Bad practice |
| GC_UNCHECKED_TYPE_IN_GENERIC_CALL|泛型调用中未检查类型 | |
| HE: Class defines equals() but not hashCode() | Bad practice |
| HE_EQUALS_NO_HASHCODE|覆盖 equals(Object),但没有覆盖 hashCode() | |
| HE: Class defines equals() and uses Object.hashCode() | Bad practice |
| HE_EQUALS_USE_HASHCODE|覆盖了equals(Object),但是没有覆盖 hashCode(),并从 Object 继承 hashCode() 的实现 | |
| HE: Class defines hashCode() but not equals() | Bad practice |
| HE_HASHCODE_NO_EQUALS|覆盖 hashCode(),但没有覆盖 equals(Object) | |
| HE: Class defines hashCode() and uses Object.equals() | Bad practice |
| HE_HASHCODE_USE_OBJECT_EQUALS|覆盖了 hashCode(),但是没有覆盖 equals(Object),并从 Object 继承 equals(Object) 的实现 | |
| HE: Class inherits equals() and uses Object.hashCode() | Bad practice |
HE_INHERITS_EQUALS_USE_HASHCODE|This class inherits equals(Object) from an abstract superclass, and hashCode() | |
| IC: Superclass uses subclass during initialization | Bad practice |
| IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION|在类的初始化期间,该类主动使用子类。这个子类在使用时还不会被初始化。 | |
| IMSE: Dubious catching of IllegalMonitorStateException | Bad practice |
| IMSE_DONT_CATCH_IMSE|IllegalMonitorStateException 通常只在代码中出现设计缺陷时抛出(对未锁定的对象调用 wait 或 notify)。 | |
| ISC: Needless instantiation of class that only supplies static methods | Bad practice |
| ISC_INSTANTIATE_STATIC_CLASS|此类分配基于只提供静态方法的类的对象。不需要创建这个对象,只需使用类名作为限定符直接访问静态方法。 | |
| It: Iterator next() method can't throw NoSuchElementException | Bad practice |
| IT_NO_SUCH_ELEMENT|迭代器的 next 方法不能抛出 NoSuchElementException | |
| J2EE: Store of non serializable object into HttpSession | Bad practice |
| J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION|将一个不可序列化的对象存储到 HttpSession 中。如果此会话被钝化或迁移,则会产生错误。 | |
| JCIP: Fields of immutable classes should be final | Bad practice |
| JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS|不可变类的字段应该是 final 的 | |
| ME: Public enum method unconditionally sets its field | Bad practice |
| ME_ENUM_FIELD_SETTER|将方法改成 private 或者是移除 | |
| ME: Enum field is public and mutable | Bad practice |
| ME_MUTABLE_ENUM_FIELD|考虑将此字段声明为 final and / or package-private | |
| NP: Method with Boolean return type returns explicit null | Bad practice |
| NP_BOOLEAN_RETURN_NULL|返回值为 boolean 类型的方法直接返回 null,这样会导致空指针异常 | |
| NP: Clone method may return null | Bad practice |
| NP_CLONE_COULD_RETURN_NULL|这个 Clone 方法在某些情况下似乎返回 null,但是不允许 Clone 返回 null 值。如果你确信这条路径是不可达的,那么抛出一个 AssertionError。 | |
| NP: equals() method does not check for null argument | Bad practice |
| NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT|变量调用equals方法时没有进行是否为null的判断 | |
| NP: toString method may return null | Bad practice |
| NP_TOSTRING_COULD_RETURN_NULL|toString方法可能返回null | |
| Nm: Class names should start with an upper case letter | Bad practice |
| NM_CLASS_NAMING_CONVENTION|类的名称以大写字母名称开头 | |
| Nm: Class is not derived from an Exception, even though it is named as such | Bad practice |
| NM_CLASS_NOT_EXCEPTION|类的名称中含有Exception但是却不是一个异常类的子类,这种名称会造成混淆 | |
| Nm: Confusing method names | Bad practice |
| NM_CONFUSING|令人迷惑的方法命名 | |
| Nm: Field names should start with a lower case letter | Bad practice |
| NM_FIELD_NAMING_CONVENTION|非final类型的字段需要遵循驼峰命名原则 | |
| Nm: Use of identifier that is a keyword in later versions of Java | Bad practice |
| NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER|验证是否是java预留关键字 | |
| Nm: Use of identifier that is a keyword in later versions of Java | Bad practice |
| NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER|验证是否时java中的关键字 | |
| Nm: Method names should start with a lower case letter | Bad practice |
| NM_METHOD_NAMING_CONVENTION|方法名称以小写字母开头 | |
| Nm: Class names shouldn't shadow simple name of implemented interface | Bad practice |
| NM_SAME_SIMPLE_NAME_AS_INTERFACE|实现同一接口实现类不能使用相同的名称,即使它们位于不同的包中 | |
| Nm: Class names shouldn't shadow simple name of superclass | Bad practice |
| NM_SAME_SIMPLE_NAME_AS_SUPERCLASS|继承同一父类的子类不能使用相同的名称,即使它们位于不同的包中 | |
| Nm: Very confusing method names (but perhaps intentional) | Bad practice |
| NM_VERY_CONFUSING_INTENTIONAL|很容易混淆的方法命名,例如方法的名称名称使用使用大小写来区别两个不同的方法。 | |
| Nm: Method doesn't override method in superclass due to wrong package for parameter | Bad practice |
| NM_WRONG_PACKAGE_INTENTIONAL|由于错误引用了不同包中相同类名的对象而不能够正确的覆写父类中的方法 | |
| ODR: Method may fail to close database resource | Bad practice |
| ODR_OPEN_DATABASE_RESOURCE|方法中可能存在关闭数据连接失败的情况 | |
| ODR: Method may fail to close database resource on exception | Bad practice |
| ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH|方法可能存在关闭数据库资源时出现异常情况 | |
| OS: Method may fail to close stream | Bad practice |
| OS_OPEN_STREAM|方法中可能存在关闭流失败的情况 | |
| OS: Method may fail to close stream on exception | Bad practice |
| OS_OPEN_STREAM_EXCEPTION_PATH|方法中可能存在关闭流时出现异常情况 | |
| PZ: Don't reuse entry objects in iterators | Bad practice |
| PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS|不要在迭代器中重用entry objects | |
| RC: Suspicious reference comparison to constant | Bad practice |
| RC_REF_COMPARISON_BAD_PRACTICE|当两者为不同类型的对象时使用equals方法来比较它们的值是否相等,而不是使用==方法。例如比较的两者为java.lang.Integer, java.lang.Float | |
| RC: Suspicious reference comparison of Boolean values | Bad practice |
| RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN|使用== 或者 !=操作符来比较两个 Boolean类型的对象,建议使用equals方法。 | |
| RR: Method ignores results of InputStream.read() | Bad practice |
| RR_NOT_CHECKED|InputStream.read方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。 | |
| RR: Method ignores results of InputStream.skip() | Bad practice |
| SR_NOT_CHECKED|InputStream.skip()方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户跳过少量字符请求的情况 | |
| RV: Negating the result of compareTo()/compare() | Bad practice |
| RV_NEGATING_RESULT_OF_COMPARETO|对compareTo()/compare()方法的结果进行取反运算 | |
| RV: Method ignores exceptional return value | Bad practice |
| RV_RETURN_VALUE_IGNORED_BAD_PRACTICE|方法忽略返回值的异常信息 | |
| SI: Static initializer creates instance before all static final fields assigned | Bad practice |
| SI_INSTANCE_BEFORE_FINALS_ASSIGNED|在所有的static final字段赋值之前去使用静态初始化的方法创建一个类的实例。 | |
| SW: Certain swing methods needs to be invoked in Swing thread | Bad practice |
| SW_SWING_METHODS_INVOKED_IN_SWING_THREAD|某些swing方法需要在Swing线程中调用 | |
| Se: Non-transient non-serializable instance field in serializable class | Bad practice |
| SE_BAD_FIELD|可序列化类中的非暂态、不可序列化的实例字段 | |
| Se: Non-serializable class has a serializable inner class | Bad practice |
| SE_BAD_FIELD_INNER_CLASS|不可序列化的类有一个可序列化的内部类 | |
| Se: Non-serializable value stored into instance field of a serializable class | Bad practice |
| SE_BAD_FIELD_STORE|非序列化的值保存在声明为序列化的的非序列化字段中 | |
| Se: Comparator doesn't implement Serializable | Bad practice |
| SE_COMPARATOR_SHOULD_BE_SERIALIZABLE|Comparator接口没有实现Serializable接口 | |
| Se: Serializable inner class | Bad practice |
| SE_INNER_CLASS|序列化内部类 | |
| Se: serialVersionUID isn't final | Bad practice |
| SE_NONFINAL_SERIALVERSIONID|serialVersionUID不是final的 | |
| Se: serialVersionUID isn't long | Bad practice |
| SE_NONLONG_SERIALVERSIONID|serialVersionUID不是long的 | |
| Se: serialVersionUID isn't static | Bad practice |
| SE_NONSTATIC_SERIALVERSIONID|serialVersionUID不是static的 | |
| Se: Class is Serializable but its superclass doesn't define a void constructor | Bad practice |
| SE_NO_SUITABLE_CONSTRUCTOR|子类序列化时父类没有提供一个void的构造函数 | |
| Se: Class is Externalizable but doesn't define a void constructor | Bad practice |
| SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION|Externalizable 实例类没有定义一个void类型的构造函数 | |
| Se: The readResolve method must be declared with a return type of Object. | Bad practice |
| SE_READ_RESOLVE_MUST_RETURN_OBJECT|readResolve从流中读取类的一个实例,此方法必须声明返回一个Object类型的对象 | |
| Se: Transient field that isn't set by deserialization. | Bad practice |
| SE_TRANSIENT_FIELD_NOT_RESTORED|该类包含一个在类中的多个位置更新的字段,因此它似乎是类状态的一部分。但是,由于字段被标记为transient,并且没有在readObject或readResolve中设置,所以它将在类的任何反序列化实例中包含默认值。 | |
| SnVI: Class is Serializable, but doesn't define serialVersionUID | Bad practice |
| SE_NO_SERIALVERSIONID|一个类实现了Serializable接口但是没有定义serialVersionUID类型的变量。序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID: | |
| ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; | |
| UI: Usage of GetResource may be unsafe if class is extended | Bad practice |
| UI_INHERITANCE_UNSAFE_GETRESOURCE|当一个类被子类继承后不要使用this.getClass().getResource(...)来获取资源 |
欢迎大家关注,点赞,收藏
知乎搜索:搬砖小李哥
微信公众号关注:搬砖小李哥