Detectors

This document lists all detectors in SpotBugs.

Standard detectors

These detectors are on by default:

AppendingToAnObjectOutputStream

このディテクタは,オブジェクト出力ストリームに追加しようとする試みを探します。

AtomicityProblem

このディテクタは,アトミックに実行されない並行抽象の操作シーケンス(たとえば,get/put)を見つけます。

BadResultSetAccess

このディテクタは,列インデックス番号が0の ResultSetgetXXX または setXXX メソッドの呼び出しを探します。 ResultSet の列インデックス番号は1で始まるので,これは常に間違いです。

BadUseOfReturnValue

このディテクタは,メソッドの戻り値が null ではないことをチェックした後で捨てるケースを探します。

BadlyOverriddenAdapter

このディテクタは, Adapter クラスを拡張して,間違ったシグネチャで Listener メソッドをオーバーライドするコードを探します。

BooleanReturnNull

このディテクタは,明示的に null 値を返す戻り型が Boolean のメソッドを探します。

CheckImmutableAnnotation

このディテクタは, net.jcip.annotations.Immutable または javax.annotation.concurrent.Immutable というアノテーションが付けられたクラスのルール違反を探します。

CheckRelaxingNullnessAnnotation

このディテクタは,オーバライドメソッドが 戻り値またはパラメータの @CheckForNull (@Nonnull で作られた) で @Nonnull (@CheckForNull で作られた) を緩和していないことをチェックします。

ComparatorIdiom

このディテクタは, Comparator を実装するクラスを書くためのイディオムの違反を探します。

ConfusedInheritance

このディテクタは, protected メンバを宣言する final クラスを探します。 このクラスは派生させることができないので, protected メンバの使用は正しくありません。 アクセス権は,メンバの正しい意図を表すために publicprivate に変更すべきです。

おそらく,新しいパラダイムにクラスのすべてを完全に変更することではなく,クラスの使用中の変化が原因となりました。

ConfusionBetweenInheritedAndOuterMethod

このディテクタは,継承されたメソッドと外部のメソッドとの潜在的混同を探します。

DefaultEncodingDetector

このディテクタは,ユーザのデフォルトプラットフォームエンコーディングを使用して, byte から String (または String から byte) に変換するメソッドの呼び出しをチェックします。 これはアプリケーションの振る舞いがプラットフォーム間で異なる原因となります。

DoInsideDoPrivileged

このディテクタは, doPrivileged ブロックの中で実行すべきコードを探します。

DontCatchIllegalMonitorStateException

このディテクタは, IllegalMonitorStateException をキャッチする try-catch ブロックを探します。

DontIgnoreResultOfPutIfAbsent

このディテクタは, ConcurrentMapputIfAbsent メソッドの結果が無視されるなら,2番目の引数として渡された値が再利用されていないことをチェックします。

DontUseEnum

このディテクタは,フィールドとメソッドが J2SE 5.0のキーワードである assertenum を名前として使用していないことをチェックします。

DroppedException

このディテクタは,例外をキャッチしていますが,何もしていないコードを探します。

DumbMethods

このディテクタは,引数のない String コンストラクタのような無意味なメソッドの呼び出しを探します。

DuplicateBranches

このディテクタは,2つの分岐に同じコードがある if/else または switch 文を探します。 これは多くの場合,2つの分岐に同じコードをコピー & ペーストしていることが片方の分岐の間違ったロジックの原因になります。

EqualsOperandShouldHaveClassCompatibleWithThis

このディテクタは, equals メソッドを定義しているクラスと互換性がないクラスのインスタンスをオペランドにしてチェックする equals メソッドをチェックします。

ExplicitSerialization

このディテクタは,このクラスが本当に直列化されるという証拠として, readObjectwriteObject による明示的な直列化を探します。

FinalizerNullsFields

このディテクタは,クラスのフィールドを null にするファイナライザを探します。 どんな方法でもフィールドを null にすることは効果がなく,ガベージコレクタの助けになりません。

FindBadForLoop

このディテクタは,間違った for ループを探します。

FindComparatorProblems

このディテクタは, Comparator.compare または Comparable.compareTo の実装における問題を探します。

FindDoubleCheck

このディテクタは,ダブルチェックロッキングのインスタンスを探します。

FindEmptySynchronizedBlock

このディテクタは,空の synchronized ブロックを探します。

FindFieldSelfAssignment

このディテクタは,フィールドが同じフィールドの値を読み出して代入される場所を探します。

FindFloatEquality

このディテクタは,浮動小数点の等価式を探します。

高速ディテクタです。

FindHEmismatch

このディテクタは, hashCode メソッドと equals メソッドの定義の問題を探します。

FindInconsistentSync2

このディテクタは,ロックに関して一貫性のない方法でアクセスされるフィールドを探します。

低速ディテクタです。

FindJSR166LockMonitorenter

このディテクタは,JSR-166 のロックで実行される通常の同期化を探します。

中速ディテクタです。

FindLocalSelfAssignment2

このディテクタは,ローカル変数の自己代入を探します。

FindMaskedFields

このディテクタは,メソッドで定義されたローカル変数によって隠されるフィールドを探します。

FindMismatchedWaitOrNotify

このディテクタは,現在ロックされているオブジェクトで作成されるように見えない wait メソッド, notify メソッド, notifyAll メソッドの呼び出しを探します。

中速ディテクタです。

このディテクタは,まだ開発中で,あまりに多くの誤検出が発生するので,無効にされています。

FindNakedNotify

このディテクタは,可変オブジェクトの状態を変更するとは思えない notify メソッドの呼び出しを探します。

FindNonShortCircuit

このディテクタは,非短絡論理演算子の疑わしい使用を探します(||&& の代わりに |&)。

FindNullDeref

このディテクタは, NullPointerException が発生するかもしれない場所を探します。 また, null に対する参照値の冗長な比較を探します。

低速ディテクタです。

FindNullDerefsInvolvingNonShortCircuitEvaluation

このディテクタは, NullPointerException が発生するかもしれない場所を探します。 非短絡評価の使用はありふれたテクニックで失敗の原因になります。

FindOpenStream

このディテクタは,メソッドから脱出しないで,メソッドからのすべての経路でクローズされるように見えない I/O ストリームオブジェクトを探します。

低速ディテクタです。

FindPuzzlers

このディテクタは,Joshua Bloch と Neal Gafter が『Java Puzzlers』で言及した多方面にわたるささいな誤りを探します。

FindRoughConstants

このディテクタは,ほぼ (しかし,正確ではなく) 同じである Math.PI のような既知の定数を見つけます。

FindRunInvocations

このディテクタは, Thread.run() の呼び出しを探します。

高速ディテクタです。

FindSleepWithLockHeld

このディテクタは,ロックを保持している状態での Thread.sleep() の呼び出しを探します。

低速ディテクタです。

FindSpinLoop

このディテクタは,フィールドからの読み取りをするスピンループを探します。

FindSqlInjection

このディテクタは, switch 文で定数文字列以外の何かが引数として渡される SQL 文の execute メソッドの呼び出しを探すためにデータフロー解析を使います。

FindTwoLockWait

このディテクタは,2つ以上のロックを保持している状態で wait メソッドの呼び出しを探します。

低速ディテクタです。

FindUncalledPrivateMethods

このディテクタは,決して呼び出されない private メソッドを探します。

FindUnconditionalWait

このディテクタは,条件文,またはループの中にない wait メソッドの呼び出しを探します。

FindUninitializedGet

このディテクタは,コンストラクタで初期化されていないフィールドの読み出しを探します。

FindUnrelatedTypesInGenericContainer

このディテクタは,引数の型がコレクションのパラメータに関連しているかどうか確かめるために java.lang.Object を受け取る総称型コレクションメソッドへの呼び出しの引数を見ます。 無関係なクラス型による引数は決してコレクションの中に格納されることはありません。 たとえば, fooList<String> で, barStringBuffer なら foo.contains(bar) の呼び出しは常に false を返すことになります。

高速ディテクタです。

FindUnreleasedLock

このディテクタは,JSR-166(java.util.concurrent) のロックを獲得したのにメソッドからのすべての経路で解除されないロックを探します。

中速ディテクタです。

補助クラスパスに java.util.concurrent パッケージ (またはパッケージ自体を解析している) が必要であることに注意してこのディテクタを使用してください

FindUnsatisfiedObligation

このディテクタは,メソッドからのすべての経路でクリーンアップされない入出力ストリームとデータベースリソースを探します。

低速ディテクタです。

FindUnsyncGet

このディテクタは,set メソッドは同期化していて get メソッドは同期化していない get メソッドと set メソッドを探します。

FindUseOfNonSerializableValue

このディテクタは,それらが直列化可能であることを要求するコンテキストで,非 Serializable オブジェクトの使用を探します。

FindUselessControlFlow

このディテクタは,効果がない制御フロー文を探します。

FindUselessObjects

このディテクタは役に立たないオブジェクトを探します。

HugeSharedStringConstants

このディテクタは,複数のクラスファイルにわたって複製されている文字列定数を探します。

IDivResultCastToDouble

このディテクタは,整数除算の結果が double にキャストされる場所を探します。 多くの場合,意味されたことは,整数オペランドを double にキャストしてから除算を実行することでした。

InconsistentAnnotations

このディテクタは,型修飾子が直接適用されるメソッドパラメータとそれらのメソッドパラメータの使い方との間で矛盾を見つけます。

InfiniteLoop

このディテクタは,無限ループを探します。

InfiniteRecursiveLoop

このディテクタは,無限再帰ループを探します。

InheritanceUnsafeGetResource

このディテクタは,クラスが別のパッケージのクラスによって拡張されるなら,予想外の結果をもたらす可能性がある this.getClass().getResource(...) の使用を探します。

InitializeNonnullFieldsInConstructor

このディテクタは,コンストラクタで書き込まれない非 null フィールドを見つけます。

InstantiateStaticClass

このディテクタは, static メソッドしか定義していないクラスのオブジェクトを作成しているコードを探します。

IntCast2LongAsInstant

このディテクタは,エポックからミリ秒を記述する32ビット値の使い方を見つけます。

IteratorIdioms

このディテクタは, Iterator クラスの定義方法の問題を探します。

LazyInit

このディテクタは,フィールドが volatile ではないフィールドの遅延初期化を探します。

中速ディテクタです。

LoadOfKnownNullValue

このディテクタは, null とわかっている値の読み出しを探します。

LostLoggerDueToWeakReference

このディテクタは,OpenJDK 1.6の下で異なる振る舞いをするコードを探します。OpenJDK 1.6では, Logger を保持するのに弱参照が使われます。

MultithreadedInstanceAccess

このディテクタは,Struts フレームワークを実装する際の潜在的な問題を探します。

MutableEnum

このディテクタは,可変列挙型フィールドを探して警告します。

MutableLock

このディテクタは,変更されたフィールドから読み込まれるオブジェクトの同期化を探します。

NoteUnconditionalParamDerefs

このディテクタは,無条件にパラメータの参照外しが行われるのかを決定するためにアプリケーションのすべてのメソッドを解析します。 この情報は, null 値がメソッドに渡されるかもしれない呼び出し場所を発見するために後の解析パスで使われます。

低速ディテクタです。

NumberConstructor

このディテクタは, Number コンストラクタのプリミティブ型の引数による呼び出しを探します。

OptionalReturnNull

このディテクタは, Optional の戻り型が明示的に null 値を返すメソッドを探します。

PreferZeroLengthArrays

このディテクタは,配列か明示的に null 参照を返すメソッドを探します。 長さが0の配列を返すことは,このコンテキストにおいて null 参照を返すことよりも一般的に好ましいです。

QuestionableBooleanAssignment

このディテクタは,条件式で変数にリテラルブール値の単純な代入を探します。

ReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass

このディテクタは,スーパークラスのためのコンストラクタから呼び出されるメソッドをチェックします。

ReadReturnShouldBeChecked

このディテクタは,戻り値が無視される InputStream.read() または InputStream.skip() の呼び出しを探します。

RedundantConditions

このディテクタは,この式 (x >= 10 && x >= 5) の2番目の条件のような役に立たない条件を含んでいるコードを探します.

RedundantInterfaces

このディテクタは,スーパークラスと同じインタフェースを実装すると宣言しているサブクラスを探します。 スーパークラスがインタフェースを実装しているので,サブクラスで同じことをするのは冗長です。

RepeatedConditionals

このディテクタは, (x == 5 || x == 5) のような繰り返される条件テストを含んでいるコードを探します。

RuntimeExceptionCapture

このディテクタは,ブロックの中のコードが例外をスローしないのに例外をキャッチする catch 節を探します。

SerializableIdiom

このディテクタは, Serializable クラスの実装の潜在的な問題を探します。

StartInConstructor

このディテクタは,スレッドを開始するコンストラクタを探します。

StaticCalendarDetector

Calendar は,マルチスレッドでの使用は本質的に安全ではないので,このディテクタは, java.util.Calendarjava.text.DateFormat (サブクラスも) の static フィールドについて警告します。

StringConcatenation

このディテクタは,+を使ったループによる文字列の連結を探します。

SuperfluousInstanceOf

このディテクタは,静的に判定される instanceof 演算子を使用している型チェックを探します。

SuspiciousThreadInterrupted

このディテクタは,非スタティックなコンテキストから Thread.interrupted() の呼び出しを探します。 Thread.currentThread().interrupted() から呼び出されるなら,役に立たない行為なので Thread.interrupted() を使用します。 しかしながら, interrupted メソッドは常にカレントスレッドで呼び出されるので,任意のスレッドオブジェクトで呼び出すのはほぼ間違いなく誤りです。

SynchronizationOnSharedBuiltinConstant

このディテクタは,共有された組込み定数 (たとえば, String) の同期化を探します。

SynchronizeAndNullCheckField

このディテクタは,同期化されたフィールドを null チェックしているコードを探します。

SynchronizeOnClassLiteralNotGetClass

このディテクタは,クラスリテラルではなく, getClass メソッドの結果で同期化するコードを探します。

SynchronizingOnContentsOfFieldToProtectField

このディテクタは,フィールドの更新をガードするためにフィールドを同期化しているように思われるコードを探します。

URLProblems

java.net.URLequalshashCode メソッドはドメイン名の解決をします。 その結果,これらの操作はかなり高くつきます。このディテクタは,メソッドが呼び出されるかもしれない場所を探します。

UncallableMethodOfAnonymousClass

このディテクタは,無名内部クラスに定義されたメソッドで,スーパークラスのメソッドをオーバーライドすることを意図していますが,実際はオーバーライドになっていないメソッドを探します。

UnnecessaryMath

このディテクタは,計算結果が静的に知られている値を計算するために java.lang.Mathstatic メソッドを呼び出すコードを探します。 その代わりに定数を使用する方がより高速で,ときにはより正確です。

VarArgsProblems

このディテクタは,J2SE 5.0の可変長引数に起因する問題を探します。

VolatileUsage

このディテクタは, volatile フィールドの使い方のバグパターンを探します。

WrongMapIterator

このディテクタは, keySet イテレータから取り出されたキーを使用して Map エントリの値にアクセスするコードを探します。

XMLFactoryBypass

このディテクタは,XML インタフェースを実装したクラスのインスタンスを直接生成しているコードを探します。 これらのオブジェクトを作成するために提供されたファクトリパターンを使用するのではなく,特定の実装にコードを結びつけます。

Disabled detectors

These detectors are off by default:

BadAppletConstructor

このディテクタは, Applet スタブに依存する親 Applet でメソッドを呼び出す Applet コンストラクタを探します。 このスタブは init メソッドの前まで初期化されないので,これらのメソッドはコンストラクタで失敗します。

CallToUnsupportedMethod

このディテクタは,サポートされていないメソッドの呼び出しを探します。

CheckExpectedWarnings

このディテクタは,@ExpectedWarning と @NoWarning アノテーションをチェックします。 このディテクタは,SpotBugs をテストするためだけに使われます。

CovariantArrayAssignment

このディテクタは,実行時に ArrayStoreException を引き起こすかもしれない Object[] array = new String[10] のような共変配列代入を探します。

EmptyZipFileEntry

このディテクタは,空の zip ファイルエントリの作成を探します。

中速ディテクタです。

FindCircularDependencies

このディテクタは,クラス間の循環依存関係を探します。

InefficientIndexOf

このディテクタは, String.indexOf(String) または String.lastIndexOf(String) を使用して定数に長さ1の文字列を渡すコードを探します。 より効率的な整数実装を使用することを推奨します。 高速ディテクタです。

InefficientMemberAccess

このディテクタは,所有クラスの private フィールドに書き込んでいる内部クラスを探します。 この場合,コンパイラは必ずこのフィールドへ書き込むことに使われるアクセサメソッドを生成します。 可視性を protected に緩和することは,フィールドに直接書き込むことを可能にします。

InefficientToArray

このディテクタは, toArray(T[] a) メソッドに長さが0の配列を渡してコレクションを配列に変換するコードを探します。

PublicSemaphores

このディテクタは,同期化して this に対して wait メソッド, notify メソッド, notifyAll メソッドを使用する public クラスを探します。 これは public クラスの同期化実装を暴露することになります。 クラスのクライアントは,そのクラスのインスタンスをそれ自身の同期オブジェクトとして使用し,ベース実装に大惨事をもたらします。

UselessSubclassMethod

このディテクタは,スーパークラスで定義されたメソッドを実装して,スーパークラスのメソッドにパラメータをそのまま渡しているだけのサブクラスを探します。 これらのメソッドは除去できます。