Detectors¶
This document lists all detectors in SpotBugs.
Standard detectors¶
These detectors are on by default:
AppendingToAnObjectOutputStream¶
このディテクタは,オブジェクト出力ストリームに追加しようとする試みを探します。
AtomicityProblem¶
このディテクタは,アトミックに実行されない並行抽象の操作シーケンス(たとえば,get/put)を見つけます。
BadResultSetAccess¶
このディテクタは,列インデックス番号が0の ResultSet
の getXXX
または setXXX
メソッドの呼び出しを探します。
ResultSet
の列インデックス番号は1で始まるので,これは常に間違いです。
BadSyntaxForRegularExpression¶
このディテクタは,無効な構文がある正規表現を探します。
BadUseOfReturnValue¶
このディテクタは,メソッドの戻り値が null
ではないことをチェックした後で捨てるケースを探します。
BadlyOverriddenAdapter¶
このディテクタは, Adapter
クラスを拡張して,間違ったシグネチャで Listener
メソッドをオーバーライドするコードを探します。
BooleanReturnNull¶
このディテクタは,明示的に null
値を返す戻り型が Boolean
のメソッドを探します。
CheckImmutableAnnotation¶
このディテクタは, net.jcip.annotations.Immutable
または javax.annotation.concurrent.Immutable
というアノテーションが付けられたクラスのルール違反を探します。
CheckRelaxingNullnessAnnotation¶
このディテクタは,オーバライドメソッドが 戻り値またはパラメータの @CheckForNull
(@Nonnull
で作られた) で @Nonnull
(@CheckForNull
で作られた) を緩和していないことをチェックします。
CheckTypeQualifiers¶
このディテクタは,JSR-305 の型修飾子アノテーションで特定されたプロパティの違反をチェックします。
- TQ: 型修飾子アノテーションが付けられた値がその修飾子を付けてはならない値を必要とする場所で使われている
- TQ: 互換性のない型修飾子による比較値
- TQ: 値は型修飾子を必要としているが,不明としてマークされている
- TQ: 値は型修飾子を必要としないが,不明としてマークされている
- TQ: 型修飾子を付けていないかもしれない値がその型修飾子を必要とする方法で常に使われている
- TQ: 型修飾子を付けているかもしれない値がその型修飾子を禁止する方法で常に使われている
- TQ: 型修飾子アノテーションが付けられていない値がその修飾子が付けられた値を必要とする場所で使われている
- TQ: 型修飾子がない値が修飾子を必要とする場所で使われている
CloneIdiom¶
このディテクタは, Cloneable
クラスを書くためのイディオムの違反を探します。
ComparatorIdiom¶
このディテクタは, Comparator
を実装するクラスを書くためのイディオムの違反を探します。
ConfusedInheritance¶
このディテクタは, protected
メンバを宣言する final
クラスを探します。
このクラスは派生させることができないので, protected
メンバの使用は正しくありません。
アクセス権は,メンバの正しい意図を表すために public
か private
に変更すべきです。
おそらく,新しいパラダイムにクラスのすべてを完全に変更することではなく,クラスの使用中の変化が原因となりました。
ConfusionBetweenInheritedAndOuterMethod¶
このディテクタは,継承されたメソッドと外部のメソッドとの潜在的混同を探します。
CrossSiteScripting¶
このディテクタは XSS 脆弱性の自明で露骨なケースを探します。
DefaultEncodingDetector¶
このディテクタは,ユーザのデフォルトプラットフォームエンコーディングを使用して, byte
から String
(または String
から byte
) に変換するメソッドの呼び出しをチェックします。
これはアプリケーションの振る舞いがプラットフォーム間で異なる原因となります。
DoInsideDoPrivileged¶
このディテクタは, doPrivileged
ブロックの中で実行すべきコードを探します。
DontCatchIllegalMonitorStateException¶
このディテクタは, IllegalMonitorStateException
をキャッチする try-catch
ブロックを探します。
DontIgnoreResultOfPutIfAbsent¶
このディテクタは, ConcurrentMap
の putIfAbsent
メソッドの結果が無視されるなら,2番目の引数として渡された値が再利用されていないことをチェックします。
DontUseEnum¶
このディテクタは,フィールドとメソッドが J2SE 5.0のキーワードである assert
や enum
を名前として使用していないことをチェックします。
DroppedException¶
このディテクタは,例外をキャッチしていますが,何もしていないコードを探します。
DumbMethodInvocations¶
このディテクタは,メソッド (例:substring(0)
) に渡されている間違った引数を探します。
DumbMethods¶
このディテクタは,引数のない String
コンストラクタのような無意味なメソッドの呼び出しを探します。
- BC: equals メソッドは引数の型を仮定すべきではない
- BIT: 符号付きバイト値のビット加算
- BIT: 符号付きバイト値のビット論理和
- Dm: ランタイムリテンションなしで,アノテーションの存在を調べるためにリフレクションを使用することはできない
- DMI: 逆にされたメソッド引数
- DMI: 正確に表されない double から構築された BigDecimal
- DMI: hasNext メソッドで next メソッドを呼び出している
- Dm: URL の Map や Set はひどい性能になる
- DMI: D’oh! 無意味なメソッド呼び出し
- Dm: ScheduledThreadPoolExecutor の最大プールサイズを変えようとする無駄な試み
- DMI: int に対して Double.longBitsToDouble() を呼び出している
- DMI: Random オブジェクトが作成され1度しか使われない
- Dm: コアプールサイズが0の ScheduledThreadPoolExecutor の作成
- Dm: Thread オブジェクトが Runnable が期待されているところに渡されている
- Dm: EasyMock メソッドへの役に立たない/無意味な呼び出し
- Dm: 効率が悪い Boolean コンストラクタを呼び出しているメソッド
- Bx: プリミティブが比較でボクシングされている
- Bx: プリミティブを解析するためのボクシング/アンボクシング
- Bx: toString メソッドを呼び出すためだけにボクシングされたプリミティブを割り当てている
- Dm: 呼び出したメソッドの Locale パラメータの使用を検討する
- Dm: System.exit(...) を呼び出しているメソッド
- Dm: 明示的なガベージコレクション
- Dm: Math.max と Math.min の間違った組み合わせ
- Dm: Condition で呼び出された wait メソッドを監視している
- Dm: クラスオブジェクトを得るためだけにインスタンスを作成しているメソッド
- Dm: 整数の乱数を生成するためには nextDouble メソッド ではなく nextInt メソッドを使用する
- Dm: 危険なメソッド runFinalizersOnExit を呼び出しているメソッド
- Dm: 効率が悪い new String(String) コンストラクタを呼び出しているメソッド
- Dm: String の toString メソッドを呼び出しているメソッド
- Dm: 効率が悪い new String() コンストラクタを呼び出しているメソッド
- Dm: デフォルトの空の run メソッドを使用して作成されたスレッド
- INT: int 値と long 定数との間違った比較
- INT: 負ではない値と負の定数またはゼロとの間違った比較
- INT: 符号付きバイトの間違った比較
- INT: 1を法とする整数の剰余
- INT: 整数値の無意味なビットマスク演算
- INT: 整数値の無意味な比較
- NP: readLine メソッドの結果をすぐに利用している
- RANGE: 配列インデックスは範囲外
- RANGE: 配列の長さは範囲外
- RANGE: 配列オフセットは範囲外
- RANGE: 文字列インデックスは範囲外
- RV: 0から1の乱数値は整数値0に丸められる
- RV: 符号付き32ビットハッシュコードの絶対値を計算する間違った試み
- RV: 符号付き整数の乱数の絶対値を計算する間違った試み
- RV: ハッシュコードの剰余は負かもしれない
- RV: 符号付き32ビット整数の乱数の剰余
- SW: Swing メソッドは AWT イベントディスパッチスレッドから呼び出す必要がある
DuplicateBranches¶
このディテクタは,2つの分岐に同じコードがある if
/else
または switch
文を探します。
これは多くの場合,2つの分岐に同じコードをコピー & ペーストしていることが片方の分岐の間違ったロジックの原因になります。
EqualsOperandShouldHaveClassCompatibleWithThis¶
このディテクタは, equals
メソッドを定義しているクラスと互換性がないクラスのインスタンスをオペランドにしてチェックする equals
メソッドをチェックします。
ExplicitSerialization¶
このディテクタは,このクラスが本当に直列化されるという証拠として, readObject
と writeObject
による明示的な直列化を探します。
FinalizerNullsFields¶
このディテクタは,クラスのフィールドを null
にするファイナライザを探します。
どんな方法でもフィールドを null
にすることは効果がなく,ガベージコレクタの助けになりません。
FindBadCast2¶
このディテクタは,データフロー解析を使用してオブジェクト参照の間違ったキャストを探します。
FindComparatorProblems¶
このディテクタは, Comparator.compare
または Comparable.compareTo
の実装における問題を探します。
FindDoubleCheck¶
このディテクタは,ダブルチェックロッキングのインスタンスを探します。
FindFinalizeInvocations¶
このディテクタは, finalize
メソッドの呼び出しと他のファイナライザ関連の問題を探します。
FindHEmismatch¶
このディテクタは, hashCode
メソッドと equals
メソッドの定義の問題を探します。
- Co: 抽象クラスは共変な compareTo メソッドを定義している
- Co: 共変な compareTo メソッドの定義
- Eq: 抽象クラスは共変な equals メソッドを宣言している
- Eq: compareTo(...) メソッドを定義して Object.equals() を使用しているクラス
- Eq: スーパークラスの equals メソッドをオーバーライドしていないクラス
- Eq: 列挙型は共変な equals メソッドを定義している
- Eq: equals(Object) メソッドをオーバーライドしていない equals メソッドの定義
- Eq: Object.equals(Object) をオーバーライドしていない equals メソッドの定義
- Eq: 共変な equals メソッドの定義
- Eq: 共変な equals メソッドを定義して,Object.equals(Object) を継承している
- HE: equals メソッドは定義していますが hashCode メソッドは定義していないクラス
- HE: equals メソッドを定義して Object.hashCode() を使用しているクラス
- HE: hashCode メソッドを定義していますが equals メソッドは定義していないクラス
- HE: hashCode メソッドを定義して Object.equals() を使用しているクラス
- HE: equals メソッドを継承して Object.hashCode() を使用しているクラス
- HE: ハッシュ化されたコンテキストでハッシュ化できないクラスの使用がシグネチャで宣言されている
- HE: ハッシュデータ構造で hashCode メソッドのないクラスを使用している
FindMaskedFields¶
このディテクタは,メソッドで定義されたローカル変数によって隠されるフィールドを探します。
FindMismatchedWaitOrNotify¶
このディテクタは,現在ロックされているオブジェクトで作成されるように見えない wait
メソッド, notify
メソッド, notifyAll
メソッドの呼び出しを探します。
このディテクタは,まだ開発中で,あまりに多くの誤検出が発生するので,無効にされています。
FindNonShortCircuit¶
このディテクタは,非短絡論理演算子の疑わしい使用を探します(||
と &&
の代わりに |
と &
)。
FindNullDeref¶
このディテクタは, NullPointerException
が発生するかもしれない場所を探します。
また, null
に対する参照値の冗長な比較を探します。
低速ディテクタです。
- NP: null 値を利用している
- NP: null 値を例外経路で利用している
- NP: null の引数をチェックしていないメソッド
- NP: null を返すかもしれない clone メソッド
- NP: 常に null 値のオブジェクトで close メソッドを呼び出している
- NP: readLine メソッドの結果が null なのか確かめないで値を利用している
- NP: equals メソッドは null の引数をチェックしていない
- NP: null 値を利用することが保証されている
- NP: null 値を例外経路で利用することが保証されている
- NP: メソッド呼び出しは非 null パラメータに null を渡している
- NP: null を返すかもしれないメソッドが @Nonnull 宣言されている
- NP: null 値を利用している可能性がある
- NP: null 値を例外経路で利用している可能性がある
- NP: null になっている可能性があるメソッドの戻り値を利用している
- NP: null 値を実行不可能かもしれない分岐で利用している可能性がある
- NP: メソッド呼び出しは非 null パラメータに null を渡している
- NP: メソッド呼び出しは非 null パラメータに null を渡している
- NP: 非 null パラメータに null を渡している非仮想メソッドの呼び出し
- NP: @Nonnull アノテーションが付けられたフィールドに null を格納している
- NP: null を返すかもしれない toString メソッド
- RCN: 非 null 値と null 値との冗長な比較
- RCN: 2つの null 値の冗長な比較
- RCN: null ではないことがわかっている値の冗長な null チェック
- RCN: null とわかっている値の冗長な null チェック
- RCN: 既に利用していた値の null チェック
FindNullDerefsInvolvingNonShortCircuitEvaluation¶
このディテクタは, NullPointerException
が発生するかもしれない場所を探します。
非短絡評価の使用はありふれたテクニックで失敗の原因になります。
FindPuzzlers¶
このディテクタは,Joshua Bloch と Neal Gafter が『Java Puzzlers』で言及した多方面にわたるささいな誤りを探します。
- BSHIFT: シフト演算の正しくない構文解析の可能性がある
- Bx: プリミティブ値がボクシングされて,すぐにアンボクシングされる
- Bx: プリミティブ値がプリミティブ型の型変換をするためにボクシングされて,アンボクシングされる
- Bx: プリミティブ値が3項演算子のためにアンボクシングされて,型変換される
- Bx: ボクシングされた値がアンボクシングされて,すぐに再ボクシングされる
- DLS: return 文に役に立たない代入がある
- DLS: 上書きされたインクリメント
- DMI: 月のための間違った定数値
- DMI: エントリセットの要素を加えることは,Entry オブジェクトの再利用のために失敗するかもしれない
- DMI: 配列で hashCode メソッドを呼び出している
- USELESS_STRING: 名前のない配列で toString メソッドを呼び出している
- USELESS_STRING: 配列で toString メソッドを呼び出している
- EC: 配列の equals メソッド呼び出しは == と等価である
- BSHIFT: 32ビット int の-31から31の範囲を超えた量によるシフト
- ICAST: 整数乗算の結果を long にキャストしている
- BSHIFT: 符号なし右シフトを short/byte にキャストしている
- IC: スーパークラスは初期化中にサブクラスを使用している
- IJU: run メソッドでの JUnit アサーションは JUnit によって通知されない
- IM: 平均の計算はオーバーフローする可能性がある
- IM: 負数で機能しない奇数チェック
- IM: 整数剰余の結果の整数乗算
- PZ: 繰り返しでエントリオブジェクトを再利用しない
- RV: compareTo()/compare() の結果を無効にする
FindRefComparison¶
このディテクタは,2つの参照値を ==
や !=
演算子で比較している場所を探します。
java.lang.String
のような型のクラスの参照値を比較することは一般的に誤りです。
- DMI: D’oh! 無意味なメソッド呼び出し
- EC: equals メソッドを使用して配列と非配列を比較している
- EC: 配列の equals メソッド呼び出しは == と等価である
- EC: equals(...) メソッドを使用して互換性のない配列を比較している
- EC: equals(null) の呼び出し
- EC: equals メソッドを呼び出して無関係のクラスとインタフェースを比較している
- EC: equals メソッドを呼び出して異なる型のインタフェースを比較している
- EC: equals メソッドを呼び出して異なる型を比較している
- EC: 参照等価性を使用して異なる型を比較している
- ES: String パラメータを == や != を使用して比較している
- ES: String オブジェクトを == や != を使用して比較している
- RC: 疑わしい参照比較
- RC: 定数の疑わしい参照比較
- RC: Boolean 値の疑わしい参照比較
FindReturnRef¶
このディテクタは,可変静的データを返すメソッドを探します。
FindSelfComparison¶
このディテクタは,値がそれ自身と比較される場所を探します。
FindSelfComparison2¶
このディテクタは,値がそれ自身と比較される場所を探します。
FindSqlInjection¶
このディテクタは, switch
文で定数文字列以外の何かが引数として渡される SQL 文の execute
メソッドの呼び出しを探すためにデータフロー解析を使います。
FindUnreleasedLock¶
このディテクタは,JSR-166(java.util.concurrent) のロックを獲得したのにメソッドからのすべての経路で解除されないロックを探します。
中速ディテクタです。
補助クラスパスに java.util.concurrent パッケージ (またはパッケージ自体を解析している) が必要であることに注意してこのディテクタを使用してください
FindUnsyncGet¶
このディテクタは,set メソッドは同期化していて get メソッドは同期化していない get メソッドと set メソッドを探します。
FindUseOfNonSerializableValue¶
このディテクタは,それらが直列化可能であることを要求するコンテキストで,非 Serializable
オブジェクトの使用を探します。
FormatStringChecker¶
このディテクタは,間違った書式文字列をチェックします。
- FS: 書式指示子へ渡している引数に互換性がない
- FS: 与えられた引数の型は書式指示子に合致しない
- USELESS_STRING: 書式文字列を使用して役に立たない方法で配列をフォーマットしている
- FS: Boolean 型ではない引数を %b 書式指示子を使用してフォーマットしている
- FS: printf スタイルの書式が期待されているところで MessageFormat が与えられている
- FS: 書式文字列で実際に使われるよりも多くの引数が渡されている
- FS: 無効な書式文字列
- FS: 書式文字列は足りない引数を参照している
- FS: 書式文字列ための前の引数がない
- FS: 書式文字列は n よりも %n を使用すべき
IDivResultCastToDouble¶
このディテクタは,整数除算の結果が double
にキャストされる場所を探します。
多くの場合,意味されたことは,整数オペランドを double
にキャストしてから除算を実行することでした。
IncompatMask¶
このディテクタは,疑わしいビット論理式を探します。
InconsistentAnnotations¶
このディテクタは,型修飾子が直接適用されるメソッドパラメータとそれらのメソッドパラメータの使い方との間で矛盾を見つけます。
InheritanceUnsafeGetResource¶
このディテクタは,クラスが別のパッケージのクラスによって拡張されるなら,予想外の結果をもたらす可能性がある this.getClass().getResource(...)
の使用を探します。
InitializationChain¶
このディテクタは,潜在的循環クラス初期化依存関係を探します。
InitializeNonnullFieldsInConstructor¶
このディテクタは,コンストラクタで書き込まれない非 null
フィールドを見つけます。
InstantiateStaticClass¶
このディテクタは, static
メソッドしか定義していないクラスのオブジェクトを作成しているコードを探します。
IntCast2LongAsInstant¶
このディテクタは,エポックからミリ秒を記述する32ビット値の使い方を見つけます。
InvalidJUnitTest¶
このディテクタは,不正な形式の JUnit テストを探します。
IteratorIdioms¶
このディテクタは, Iterator
クラスの定義方法の問題を探します。
LostLoggerDueToWeakReference¶
このディテクタは,OpenJDK 1.6の下で異なる振る舞いをするコードを探します。OpenJDK 1.6では, Logger
を保持するのに弱参照が使われます。
MethodReturnCheck¶
このディテクタは,戻り値が疑わしく無視されるメソッドの呼び出しを探します。
MultithreadedInstanceAccess¶
このディテクタは,Struts フレームワークを実装する際の潜在的な問題を探します。
MutableEnum¶
このディテクタは,可変列挙型フィールドを探して警告します。
MutableStaticFields¶
このディテクタは,悪意のあるコードによって変更されるかもしれない static
フィールドを探します。
Naming¶
このディテクタは,疑わしい名前のメソッドを探します。
- Nm: クラスは equal(Object) を定義しています。equals(Object) にすべきですか?
- Nm: クラス名は大文字から始めるべき
- Nm: 例外クラスのように命名されているが,クラスは Exception から派生されていない
- Nm: 紛らわしい名前のメソッド
- Nm: フィールド名は小文字から始めるべき
- Nm: クラスは hashcode() を定義しています。hashCode() にすべきですか?
- Nm: クラスは tostring() を定義しています。toString() にすべきですか?
- Nm: 明らかなメソッドとコンストラクタの混乱
- Nm: メソッド名は小文字から始めるべき
- Nm: クラス名は実装されたインタフェースの単純名を遮るべきではない
- Nm: クラス名はスーパークラスの単純名を遮るべきではない
- Nm: 非常に紛らわしい名前のメソッド
- Nm: 非常に紛らわしい名前のメソッド (多分意図的)
- Nm: パラメータの間違ったパッケージのためにスーパークラスのメソッドをオーバーライドしていないメソッド
- Nm: パラメータの間違ったパッケージのためにスーパークラスのメソッドをオーバーライドしていないメソッド
NoteUnconditionalParamDerefs¶
このディテクタは,無条件にパラメータの参照外しが行われるのかを決定するためにアプリケーションのすべてのメソッドを解析します。
この情報は, null
値がメソッドに渡されるかもしれない呼び出し場所を発見するために後の解析パスで使われます。
低速ディテクタです。
NumberConstructor¶
このディテクタは, Number
コンストラクタのプリミティブ型の引数による呼び出しを探します。
OptionalReturnNull¶
このディテクタは, Optional
の戻り型が明示的に null
値を返すメソッドを探します。
OverridingEqualsNotSymmetrical¶
このディテクタは,同値関係が対称的ではないかもしれないスーパークラスの equals
メソッドをオーバーライドする equals
メソッドを探します。
PreferZeroLengthArrays¶
このディテクタは,配列か明示的に null
参照を返すメソッドを探します。
長さが0の配列を返すことは,このコンテキストにおいて null
参照を返すことよりも一般的に好ましいです。
QuestionableBooleanAssignment¶
このディテクタは,条件式で変数にリテラルブール値の単純な代入を探します。
ReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass¶
このディテクタは,スーパークラスのためのコンストラクタから呼び出されるメソッドをチェックします。
ReadReturnShouldBeChecked¶
このディテクタは,戻り値が無視される InputStream.read()
または InputStream.skip()
の呼び出しを探します。
RedundantConditions¶
このディテクタは,この式 (x >= 10 && x >= 5)
の2番目の条件のような役に立たない条件を含んでいるコードを探します.
RedundantInterfaces¶
このディテクタは,スーパークラスと同じインタフェースを実装すると宣言しているサブクラスを探します。 スーパークラスがインタフェースを実装しているので,サブクラスで同じことをするのは冗長です。
RuntimeExceptionCapture¶
このディテクタは,ブロックの中のコードが例外をスローしないのに例外をキャッチする catch
節を探します。
SerializableIdiom¶
このディテクタは, Serializable
クラスの実装の潜在的な問題を探します。
- RS: readObject メソッドを同期化しているクラス
- Se: 直列化可能クラスの非 transient で非直列化可能なインスタンスフィールド
- Se: 非直列化可能クラスに直列化可能な内部クラスがある
- Se: 非直列化可能な値を直列化可能クラスのインスタンスフィールドに格納している
- Se: 直列化可能な内部クラス
- Se: 直列化機構のために private にしなければならないメソッド
- Se: serialVersionUID が final ではない
- Se: serialVersionUID が long ではない
- Se: serialVersionUID が static ではない
- SnVI: Serializable なクラスが serialVersionUID を定義していない
- Se: Serializable なクラスのスーパークラスで,引数なしコンストラクタを定義していない
- Se: Externalizable なクラスが引数なしコンストラクタを定義していない
- Se: サブクラスで継承できない private な readResolve メソッド
- Se: readResolve メソッドが static メソッドとして宣言されている
- Se: readResolve メソッドの戻り値の型が Object で宣言されていない
- Se: 直列化復元によって設定されない transient フィールド
- Se: Serializable ではないクラスの transient フィールド
- WS: writeObject メソッドは同期化しているがその他のメソッドは同期化していないクラス
StaticCalendarDetector¶
Calendar
は,マルチスレッドでの使用は本質的に安全ではないので,このディテクタは, java.util.Calendar
や java.text.DateFormat
(サブクラスも) の static
フィールドについて警告します。
SuperfluousInstanceOf¶
このディテクタは,静的に判定される instanceof
演算子を使用している型チェックを探します。
SuspiciousThreadInterrupted¶
このディテクタは,非スタティックなコンテキストから Thread.interrupted()
の呼び出しを探します。
Thread.currentThread().interrupted()
から呼び出されるなら,役に立たない行為なので Thread.interrupted()
を使用します。
しかしながら, interrupted
メソッドは常にカレントスレッドで呼び出されるので,任意のスレッドオブジェクトで呼び出すのはほぼ間違いなく誤りです。
SwitchFallthrough¶
このディテクタは,フォールスルーがある switch
文を探します。
SynchronizeAndNullCheckField¶
このディテクタは,同期化されたフィールドを null
チェックしているコードを探します。
SynchronizeOnClassLiteralNotGetClass¶
このディテクタは,クラスリテラルではなく, getClass
メソッドの結果で同期化するコードを探します。
SynchronizingOnContentsOfFieldToProtectField¶
このディテクタは,フィールドの更新をガードするためにフィールドを同期化しているように思われるコードを探します。
URLProblems¶
java.net.URL
の equals
と hashCode
メソッドはドメイン名の解決をします。
その結果,これらの操作はかなり高くつきます。このディテクタは,メソッドが呼び出されるかもしれない場所を探します。
UncallableMethodOfAnonymousClass¶
このディテクタは,無名内部クラスに定義されたメソッドで,スーパークラスのメソッドをオーバーライドすることを意図していますが,実際はオーバーライドになっていないメソッドを探します。
UnnecessaryMath¶
このディテクタは,計算結果が静的に知られている値を計算するために java.lang.Math
の static
メソッドを呼び出すコードを探します。
その代わりに定数を使用する方がより高速で,ときにはより正確です。
UnreadFields¶
このディテクタは,値が決して読み出されないフィールドを探します。
- NP: 書き込まれていないフィールドの読み出し
- NP: 書き込まれていない public または protected フィールドの読み出し
- SIC: static 内部クラスにすべき
- SIC: 名前付き static 内部クラスにリファクタリングできるかもしれない
- SIC: static 内部クラスにリファクタリングできるかもしれない
- SIC: 非 static 内部クラスとスレッドローカルのデッドロック
- SS: 読み出されないフィールド
- ST: インスタンスメソッドから static フィールドへの書き込み
- UrF: 読み出されないフィールド
- UrF: 読み出されない public または protected フィールド
- UuF: 未使用のフィールド
- UuF: 未使用の public または protected フィールド
- UwF: コンストラクタで初期化されていないフィールドを null チェックなしで null 値を利用している
- UwF: null に設定されるだけのフィールド
- UwF: 書き込まれていないフィールド
- UwF: 書き込まてれいない public または protected フィールド
VolatileUsage¶
このディテクタは, volatile
フィールドの使い方のバグパターンを探します。
WaitInLoop¶
このディテクタは,ループの中にない wait
メソッドの呼び出しを探します。
WrongMapIterator¶
このディテクタは, keySet
イテレータから取り出されたキーを使用して Map
エントリの値にアクセスするコードを探します。
XMLFactoryBypass¶
このディテクタは,XML インタフェースを実装したクラスのインスタンスを直接生成しているコードを探します。 これらのオブジェクトを作成するために提供されたファクトリパターンを使用するのではなく,特定の実装にコードを結びつけます。
Disabled detectors¶
These detectors are off by default:
BadAppletConstructor¶
このディテクタは, Applet
スタブに依存する親 Applet
でメソッドを呼び出す Applet
コンストラクタを探します。
このスタブは init
メソッドの前まで初期化されないので,これらのメソッドはコンストラクタで失敗します。
CheckExpectedWarnings¶
このディテクタは,@ExpectedWarning と @NoWarning アノテーションをチェックします。 このディテクタは,SpotBugs をテストするためだけに使われます。
CovariantArrayAssignment¶
このディテクタは,実行時に ArrayStoreException
を引き起こすかもしれない Object[] array = new String[10]
のような共変配列代入を探します。
InefficientIndexOf¶
このディテクタは, String.indexOf(String)
または String.lastIndexOf(String)
を使用して定数に長さ1の文字列を渡すコードを探します。
より効率的な整数実装を使用することを推奨します。
高速ディテクタです。
InefficientInitializationInsideLoop¶
このディテクタは,パフォーマンスを向上させるために外側に移せるループ内で初期化しているオブジェクトを探します。
InefficientMemberAccess¶
このディテクタは,所有クラスの private
フィールドに書き込んでいる内部クラスを探します。
この場合,コンパイラは必ずこのフィールドへ書き込むことに使われるアクセサメソッドを生成します。
可視性を protected
に緩和することは,フィールドに直接書き込むことを可能にします。
InefficientToArray¶
このディテクタは, toArray(T[] a)
メソッドに長さが0の配列を渡してコレクションを配列に変換するコードを探します。
PublicSemaphores¶
このディテクタは,同期化して this
に対して wait
メソッド, notify
メソッド, notifyAll
メソッドを使用する public
クラスを探します。
これは public
クラスの同期化実装を暴露することになります。
クラスのクライアントは,そのクラスのインスタンスをそれ自身の同期オブジェクトとして使用し,ベース実装に大惨事をもたらします。
UselessSubclassMethod¶
このディテクタは,スーパークラスで定義されたメソッドを実装して,スーパークラスのメソッドにパラメータをそのまま渡しているだけのサブクラスを探します。 これらのメソッドは除去できます。