FindBugs 規(guī)則整理:Bad Practice

目前已轉(zhuǎn)至個人博客,本系列地址:Lam's Blog - Knowledge as Action

NM_SAME_SIMPLE_NAME_AS_SUPERCLASS

  • 翻譯
    The class name ... shadows the simple name of the superclass ...
    This class has a simple name that is identical to that of its superclass, except that its superclass is in a different package (e.g.,alpha.Fooextendsbeta.Foo). This can be exceptionally confusing, create lots of situations in which you have to look at import statements to resolve references and creates many opportunities to accidently define methods that do not override methods in their superclasses.

    某個類的名字和父類名稱一樣蛮拔,這將會導致混亂的情況话肖,一旦出現(xiàn)問題也將難以發(fā)現(xiàn)剥纷。
  • 原因
    同翻譯
  • 解決方案
    修改父類或者子類的名稱

ES_COMPARING_STRINGS_WITH_EQ

  • 翻譯
    Comparison of String objects using == or != in ...
    This code ... for reference equality using the == or != operators. Unless both strings are either constants in a source file, or have been interned using the String.intern() method, the same string value may be represented by two different String objects. Consider using the equals(Object) method instead.

    使用==或者!=來比較字符串對象抒钱。除非兩個字符串是同一個源文件里的常量翘魄,或者使用String.intern()方法鼎天,否則兩個同樣值的字符串可能會被兩個不一樣的字符串對象持有,考慮使用equals(Object)來比較熟丸。
  • 原因
    使用==或者!=來比較字符串會比較兩個字符串對象的內(nèi)存地址训措,通常這是不一樣的伪节。
  • 解決方案
    如果是想比較值的話通過equals(Object)來比較

SE_BAD_FIELD

  • 翻譯
    Class ... defines non-transient non-serializable instance field ...
    This Serializable class defines a non-primitive instance field which is neither transient, Serializable, orjava.lang.Object, and does not appear to implement the Externalizableinterface or the readObject() and writeObject() methods. Objects of this class will not be deserialized correctly if a non-Serializable object is stored in this field.

    該可序列化類定義了一個非暫存也不可序列化的非原始實例字段光羞,也沒有實現(xiàn)Externalizable接口或者readObject() 和 writeObject()方法绩鸣,所以如果非序列化對象被存儲在該字段里,那么這個類的對象將無法正確將其反序列化
  • 原因
    序列化時所有的成員變量都必須遞歸的實現(xiàn)序列化纱兑,否則將導致序列化失敗呀闻。如果某個成員變量不想被序列化要么標注為瞬態(tài)要么重寫readObj方法
  • 解決方案
    給字段加上序列化或者瞬態(tài)關鍵字transient

AM_CREATES_EMPTY_JAR_FILE_ENTRY

Creates an empty jar file entry
調(diào)用putNextEntry()方法寫入新的 jar 文件條目時立即調(diào)用closeEntry()方法。這樣會造成JarFile條目為空潜慎。

AM_CREATES_EMPTY_ZIP_FILE_ENTRY

Creates an empty zip file entry
調(diào)用putNextEntry()方法寫入新的 zip 文件條目時立即調(diào)用closeEntry()方法捡多。這樣會造成ZipFile條目為空。

BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS

Equals method should not assume anything about the type of its argument
equals(Object o)方法不能對參數(shù)o的類型做任何的假設铐炫。比較此對象與指定的對象垒手。當且僅當該參數(shù)不為 null,并且是表示與此對象相同的類型的對象時倒信,結果才為 true科贬。

DMI_RANDOM_USED_ONLY_ONCE

Random object created and used only once
隨機創(chuàng)建對象只使用過一次就拋棄

BIT_SIGNED_CHECK

Check for sign of bitwise operation
檢查位操作符運行是否合理

CN_IDIOM

Class implements Cloneable but does not define or use clone method
類實現(xiàn)了Cloneable接口,但是沒有定義或使用clone方法鳖悠。按照慣例榜掌,實現(xiàn)此接口的類應該使用公共方法重寫 Object.clone(它是受保護的),以獲得有關重寫此方法的詳細信息乘综。

CN_IDIOM_NO_SUPER_CALL

clone method does not call super.clone()
一個非final類型的類定義了clone()方法而沒有調(diào)用super.clone()方法憎账。例如:B擴展自A,如果B中clone方法調(diào)用了spuer.clone()卡辰,而A中的clone沒有調(diào)用spuer.clone()胞皱,就會造成結果類型不準確。要求A的clone方法中調(diào)用spuer.clone()方法看政。

CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE

Class defines clone() but doesn't implement Cloneable
類中定義了clone方法但是它沒有實現(xiàn)Cloneable接口

CO_ABSTRACT_SELF

Abstract class defines covariant compareTo() method
抽象類中定義了多個compareTo()方法朴恳,正確的是覆寫Comparable中的compareTo方法,方法的參數(shù)為Object類型

CO_SELF_NO_OBJECT

Covariant compareTo() method defined
類中定義了多個compareTo()方法允蚣,正確的是覆寫Comparable中的compareTo方法于颖,方法的參數(shù)為Object類型

DE_MIGHT_DROP

Method might drop exception
方法可能拋出異常

DE_MIGHT_IGNORE

Method might ignore exception
方法可能忽略異常

DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION

Don't use removeAll to clear a collection
不要用removeAll方法去clear一個集合

DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED

Classloaders should only be created inside doPrivileged block
類加載器只能建立在特殊的方法體內(nèi)

DM_EXIT

Method invokes System.exit(...)
在方法中調(diào)用System.exit(...)語句,考慮用RuntimeException來代替

DM_RUN_FINALIZERS_ON_EXIT

Method invokes dangerous method runFinalizersOnExit
在方法中調(diào)用了System.runFinalizersOnExit 或者Runtime.runFinalizersOnExit方法嚷兔,因為這樣做是很危險的森渐。

ES_COMPARING_PARAMETER_STRING_WITH_EQ

Comparison of String parameter using == or !=
用==或者!=方法去比較String類型的參數(shù)

EQ_ABSTRACT_SELF

Abstract class defines covariant equals() method
抽象類定義了共變的compareTo()方法

EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS

Equals checks for noncompatible operand
equals方法檢查不一致的操作。兩個類根本就是父子關系而去調(diào)用equals方法去判讀對象是否相等冒晰。

EQ_COMPARETO_USE_OBJECT_EQUALS

Class defines compareTo(...) and uses Object.equals()
類定義了compareTo(...)方法同衣,卻使用Object.equals()方法

EQ_GETCLASS_AND_CLASS_CONSTANT

equals method fails for subtypes
類中的equals方法可能被子類中的方法所破壞,當使用類似于Foo.class == o.getClass()的判斷時考慮用this.getClass() == o.getClass()來替換

EQ_SELF_NO_OBJECT

Covariant equals() method defined
類中定義了多個equals方法壶运。正確的做法是覆寫Object中的equals方法耐齐,它的參數(shù)為Object類型的對象。

FI_EMPTY

Empty finalizer should be deleted
應當刪除空的finalize()方法

GC_UNCHECKED_TYPE_IN_GENERIC_CALL

Unchecked type in generic call
泛型調(diào)用中使用了未檢查的類型

HE_EQUALS_NO_HASHCODE

Class defines equals() but not hashCode()
方法定義了equals方法卻沒有定義hashCode方法

HE_HASHCODE_NO_EQUALS

Class defines hashCode() but not equals()
類定義了hashCode方法去沒有定義equal方法

HE_EQUALS_USE_HASHCODE

Class defines equals() and uses Object.hashCode()
一個類覆寫了equals方法,沒有覆寫hashCode方法埠况,使用了Object對象的hashCode方法

HE_INHERITS_EQUALS_USE_HASHCODE

Class inherits equals() and uses Object.hashCode()
子類繼承了父類的equals方法卻使用了Object的hashCode方法

IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION

Superclass uses subclass during initialization
子類在父類未初始化之前使用父類對象實例

IMSE_DONT_CATCH_IMSE

Dubious catching of IllegalMonitorStateException
可疑的IllegalMonitorStateException異常捕捉

ISC_INSTANTIATE_STATIC_CLASS

Needless instantiation of class that only supplies static methods
為使用靜態(tài)方法而創(chuàng)建一個實例對象耸携。調(diào)用靜態(tài)方法時只需要使用類名+靜態(tài)方法名就可以了。

IT_NO_SUCH_ELEMENT

Iterator next() method can't throw NoSuchElementException
迭代器的next方法不能夠拋出NoSuchElementException

J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION

Store of non serializable object into HttpSession
在HttpSession對象中保存非連續(xù)的對象

JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS

Fields of immutable classes should be final
不可變類的字段應當是final的

NP_BOOLEAN_RETURN_NULL

Method with Boolean return type returns explicit null
返回值為boolean類型的方法直接返回null辕翰,這樣會導致空指針異常

NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT

equals() method does not check for null argument
變量調(diào)用equals方法時沒有進行是否為null的判斷

NP_TOSTRING_COULD_RETURN_NULL

toString method may return null
toString方法可能返回null

NM_CLASS_NAMING_CONVENTION

Class names should start with an upper case letter
類的名稱以大寫字母名稱開頭

NM_CLASS_NOT_EXCEPTION

Class is not derived from an Exception, even though it is named as such
類的名稱中含有Exception但是卻不是一個異常類的子類夺衍,這種名稱會造成混淆

NM_CONFUSING

Confusing method names
令人迷惑的方法命名

NM_FIELD_NAMING_CONVENTION

Field names should start with a lower case letter
非final類型的字段需要遵循駝峰命名原則

NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER

Use of identifier that is a keyword in later versions of Java
驗證是否是java預留關鍵字

NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER

Use of identifier that is a keyword in later versions of Java
驗證是否時java中的關鍵字

NM_METHOD_NAMING_CONVENTION

Method names should start with a lower case letter
方法名稱以小寫字母開頭

NM_SAME_SIMPLE_NAME_AS_INTERFACE

Class names shouldn't shadow simple name of implemented interface
實現(xiàn)同一接口實現(xiàn)類不能使用相同的名稱,即使它們位于不同的包中

NM_SAME_SIMPLE_NAME_AS_SUPERCLASS

Class names shouldn't shadow simple name of superclass
繼承同一父類的子類不能使用相同的名稱喜命,即使它們位于不同的包中

NM_VERY_CONFUSING_INTENTIONAL

Very confusing method names (but perhaps intentional)
很容易混淆的方法命名沟沙,例如方法的名稱使用大小寫來區(qū)別兩個不同的方法。

NM_WRONG_PACKAGE_INTENTIONAL

Method doesn't override method in superclass due to wrong package for parameter
由于錯誤引用了不同包中相同類名的對象而不能夠正確的覆寫父類中的方法

ODR_OPEN_DATABASE_RESOURCE

Method may fail to close database resource
方法中可能存在關閉數(shù)據(jù)連接失敗的情況

OS_OPEN_STREAM

Method may fail to close stream
方法中可能存在關閉流失敗的情況

OS_OPEN_STREAM_EXCEPTION_PATH

Method may fail to close stream on exception
方法中可能存在關閉流時出現(xiàn)異常情況

RC_REF_COMPARISON_BAD_PRACTICE

Suspicious reference comparison to constant
當兩者為不同類型的對象時使用equals方法來比較它們的值是否相等壁榕,而不是使用==方法矛紫。例如比較的兩者為java.lang.Integer, java.lang.Float

RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN

  • Suspicious reference comparison of Boolean values*
    使用== 或者 !=操作符來比較兩個 Boolean類型的對象,建議使用equals方法牌里。

RR_NOT_CHECKED

Method ignores results of InputStream.read()
InputStream.read方法忽略返回的多個字符含衔,如果對結果沒有檢查就沒法正確處理用戶讀取少量字符請求的情況。

SR_NOT_CHECKED

Method ignores results of InputStream.skip()
InputStream.skip()方法忽略返回的多個字符二庵,如果對結果沒有檢查就沒法正確處理用戶跳過少量字符請求的情況

RV_RETURN_VALUE_IGNORED_BAD_PRACTICE

Method ignores exceptional return value
方法忽略返回值的異常信息

SI_INSTANCE_BEFORE_FINALS_ASSIGNED

Static initializer creates instance before all static final fields assigned
在所有的static final字段賦值之前去使用靜態(tài)初始化的方法創(chuàng)建一個類的實例贪染。

SE_BAD_FIELD_STORE

Non-serializable value stored into instance field of a serializable class
非序列化的值保存在聲明為序列化的的非序列化字段中

SE_COMPARATOR_SHOULD_BE_SERIALIZABLE

Comparator doesn't implement Serializable
Comparator接口沒有實現(xiàn)Serializable接口

SE_INNER_CLASS

Serializable inner class
序列化內(nèi)部類

SE_NONFINAL_SERIALVERSIONID

serialVersionUID isn't final
serialVersionUID不是final的

SE_NO_SUITABLE_CONSTRUCTOR

Class is Serializable but its superclass doesn't define a void constructor
子類序列化時父類沒有提供一個void的構造函數(shù)

SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION

Class is Externalizable but doesn't define a void constructor
Externalizable 實例類沒有定義一個void類型的構造函數(shù)

SE_READ_RESOLVE_MUST_RETURN_OBJECT

The readResolve method must be declared with a return type of Object.
readResolve從流中讀取類的一個實例,此方法必須聲明返回一個Object類型的對象

SE_TRANSIENT_FIELD_NOT_RESTORED

Transient field that isn't set by deserialization.
不需要被反序列化的字段沒有聲明transient

SE_NO_SERIALVERSIONID

Class is Serializable, but doesn't define serialVersionUID
一個類實現(xiàn)了Serializable接口但是沒有定義serialVersionUID類型的變量催享。序列化運行時使用一個稱為 serialVersionUID 的版本號與每個可序列化類相關聯(lián)杭隙,該序列號在反序列化過程中用于驗證序列化對象的發(fā)送者和接收者是否為該對象加載了與序列化兼容的類。如果接收者加載的該對象的類的 serialVersionUID 與對應的發(fā)送者的類的版本號不同因妙,則反序列化將會導致 InvalidClassException痰憎。可序列化類可以通過聲明名為 "serialVersionUID" 的字段(該字段必須是靜態(tài) (static)攀涵、最終 (final) 的 long 型字段)顯式聲明其自己的 serialVersionUID

UI_INHERITANCE_UNSAFE_GETRESOURCE

Usage of GetResource may be unsafe if class is extended
當一個類被子類繼承后不要使用this.getClass().getResource(...)來獲取資源

其他文章(持續(xù)更新)

FindBugs:簡介與使用
FindBugs 規(guī)則整理:CORRECTNESS
FindBugs 規(guī)則整理:Style & Dodgy
FindBugs 規(guī)則整理:Malicious Code Vulnerability
FindBugs 規(guī)則整理:Multithreaded Correctness
FindBugs 規(guī)則整理:Security & Experimental
FindBugs 規(guī)則整理:Performance
FindBugs 規(guī)則整理:Internationalization

引用

整合以下文章過程中發(fā)現(xiàn)部分存在翻譯錯誤铣耘,已做修正,同時感謝以下文章作者
FindBugs使用備忘錄
FindBugs規(guī)則整理
詳解FindBugs的各項檢測器
Findbugs 缺陷詳解與英文代號的對照表

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末以故,一起剝皮案震驚了整個濱河市蜗细,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怒详,老刑警劉巖炉媒,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昆烁,居然都是意外死亡吊骤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門静尼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白粉,“玉大人传泊,你說我怎么就攤上這事⊙及停” “怎么了或渤?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奕扣。 經(jīng)常有香客問我,道長掌敬,這世上最難降的妖魔是什么惯豆? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮奔害,結果婚禮上楷兽,老公的妹妹穿的比我還像新娘。我一直安慰自己华临,他們只是感情好芯杀,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雅潭,像睡著了一般揭厚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扶供,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天筛圆,我揣著相機與錄音,去河邊找鬼椿浓。 笑死太援,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扳碍。 我是一名探鬼主播提岔,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笋敞!你這毒婦竟也來了碱蒙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤夯巷,失蹤者是張志新(化名)和其女友劉穎振亮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞭莽,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡坊秸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澎怒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褒搔。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡阶牍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出星瘾,到底是詐尸還是另有隱情走孽,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布琳状,位于F島的核電站磕瓷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏念逞。R本人自食惡果不足惜困食,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翎承。 院中可真熱鬧硕盹,春花似錦、人聲如沸叨咖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甸各。三九已至垛贤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趣倾,已是汗流浹背南吮。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留誊酌,地道東北人部凑。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像碧浊,于是被迫代替她去往敵國和親涂邀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法箱锐,而不是構造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法比勉,并非Fa...
    孫小磊閱讀 1,963評論 0 3
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法驹止,內(nèi)部類的語法浩聋,繼承相關的語法,異常的語法臊恋,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理衣洁,服務發(fā)現(xiàn),斷路器抖仅,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡書 CHAPTER3 Method...
    SnailTyan閱讀 732評論 1 4
  • 去年在大理的時候坊夫,去了心念的洱海砖第,骨子里太著迷于洱海便特意去租了一間臨著它布局氛圍又文藝溫馨的民宿。 比較幸運的是...
    端木婉清閱讀 1,143評論 13 18