デフォルトのFindBugsプラグイン
このプラグインは、全てのFindBugsの標準ディテクタを含んでいます。

]]>
正確性 C
バグの可能性 - 明らかなコーディングミスによって、開発者の意図しないコードになっている。 誤検出は最小限に留めなければならない。
Security S
A use of untrusted input in a way that could create a remotely exploitable security vulnerability.
良くない習慣 B
推奨される、あるいは本質的なコーディング規範からの逸脱。例えば、hashCodeとequalsの問題、 cloneableイディオム、例外の無視、直列化の問題、finalizeの誤用といったもの。 開発グループによっては、これらの幾つかの規範を気にとめないかもしれないが、 できる限り正確な解析を行う必要がある。
回避可能 D
誤解を与え易いコード、変則的、間違いを招き易いコード。 例えば不要なローカル変数への格納、switchのフォールスルー、確認されていないキャスト、 nullであることが明らかな値に対する冗長なnullチェックなど。 幾らかの誤検出が許容される。以前のバージョンのFindBugsではStyleカテゴリに属していたもの。
実行効率 P
必ずしも間違いではないが、実行効率が悪くなる可能性のあるもの。
脆弱性を持つコード V
信頼されていないコードからの攻撃に対して脆弱性を持つコード。
マルチスレッド環境での正確性 M
スレッド、ロック、volatileの扱いに対するコードの欠陥。
国際化 I
国際化、ロカールの扱いに対するコードの欠陥。
This detector looks for synchronization on a shared builtin constant (such as a String).

]]>
This detector looks for a field that is synchronized on and then null checked.

]]>
net.jcip.annotations.Immutableアノテーションが付けられたクラスが守るべきルールを破っているものを発見します。

]]>
Java 5.0から導入された可変引数に関する問題を発見します。

]]>
net.jcip.annotationsパッケージのアノテーションを記録します。

]]>
Note the type qualifiers relevant to analyzing a method.

]]>
edu.umd.cs.findbugs.annotations.NoteSuppressWarnings アノテーションの使用に基づき警告出力を抑制する。

]]>
retentionアノテーションを記録する。

]]>
Records synthetic classes, methods, fields, etc.

]]>
他のディテクタのために、解析されたクラスの中で定義されている全てのメソッドのデータベースを作成する。

]]>
Try to determine which classes have constant references to their .class objects.

]]>
他のディテクタのために、解析されたクラスの中で呼び出されている全てのメソッドのデータベースを作成する。

]]>
継承されたメソッドと、外部のメソッドとの潜在的なとり違えを発見する。

]]>
メソッドの戻り値チェックのアノテーションを検出する。

]]>
メソッドの戻り値をチェックするアノテーションを発見します。

]]>
Look for code that synchronizes on the results of getClass rather than on class literals.

]]>
This detector produces summary information for what is stored into fields.

]]>
メソッド、フィールド、パラメータに対する@NonNullアノテーションを発見します。これは非null値のみが許されるコンテキストにnullになる可能性のある値が使用されているケースへの警告を出力するために、FindNullDerefディテクタが使用することができます。

]]>
アプリケーション内の全メソッドを調査し、パラメータの参照外しが無条件に行なわれているコードを発見します。 この情報は後方の解析に渡され、nullが渡される可能性のあるメソッド呼び出しの解析に使用されます。

低速ディテクタです。

]]>
戻り値が常に非nullであるかどうか、アプリケーションの全メソッドについて、調査します。

]]>
Looks for methods with Boolean return type that return explicit null values.

]]>
戻り値がnullでないかチェックされた後に捨てられているケースを検出する。

]]>
this.getClass().getResource(...) の使用を発見します。このコードは、このクラスの継承クラスが、別パッケージに作成されると、思わぬ結果を招きます。高速ディテクタです。

]]>
無限再帰呼び出しのループを検出します。高速ディテクタです。

]]>
無限ループを検出します。高速ディテクタです。

]]>
無限再起呼び出しのループを検出します。低速ディテクタです。

]]>
volatileフィールドの誤った使用を検出します。高速ディテクタです。

]]>
空のzip fileエントリーを検出します。中速ディテクタです。

]]>
このディテクタは、匿名クラスの中のメソッドのうち、オーバーライドを意図していながら、実際はオーバーライドされていないメソッドを発見します。

]]>
Checks that fields and methods don't use the name assert or enum as they are keywords in Java 5.

]]>
java.net.URLのequals()とhashCode()はドメイン名の解決を必要とします。結果として、これらは非常に重い処理となるので、このディテクタは、これらのメソッドの呼び出しを発見します。

]]>
This detector looks for finalizers that null out fields of a class. This does not help the garbage collector in any way, the nulling out of fields has no effect.

]]>
This detector looks for obvious/blatent cases of cross site scripting vulnerabilities.

]]>
このディテクタは、テストのためのフックです。普通は、このディテクタは、何も行ないません。

]]>
このディテクタは複数のクラスで重複している文字列定数を発見します。

]]>
doPrivilegedブロックの中で実行しなければならないコードを発見します。

]]>
全ての参照の呼び出しが解決されているかどうかを調査します。

]]>
このディテクタは、switch文のフォールスルー(あるcaseから下のcaseに実行が移るロジック)を発見します。高速ディテクタです。

]]>
このディテクタは、フィールドの自己代入を発見します。高速ディテクタです。

]]>
値がそれ自身と比較されている場所を発見します。

]]>
値がそれ自身と比較されている場所を発見します。

]]>
このディテクタは、ビット演算子(|&)を、短絡的条件演算子(||&&)と間違えて使用していると思われるコードを発見します。

]]>
このディテクタは、IllegalMonitorStateExceptionをキャッチしているtry-catchブロックを発見します。

]]>
このディテクタは、floatを使った浮動小数演算を発見します。中速ディテクタです。

]]>
このディテクタは、クローン可能クラスが守るべきイディオムを守っていないクラスを発見します。高速ディテクタです。

]]>
このディテクタは、Comparatorを実装するクラスが守るべきイディオムを守っていないクラスを発見します。高速ディテクタです。

]]>
このディテクタは、例外をキャッチしているが、それに対して何も行っていないコードを発見します。高速ディテクタです。

]]>
nullと分かっている値のロード。

]]>
このディテクタはメソッドへの引数が間違っているものを発見します(例:substring(0)).

]]>
このディテクタは、無意味なメソッド呼び出し、例えばStringのデフォルトコンストラクタの呼び出しを発見します。高速ディテクタです。

]]>
プリミティブ型の引数を伴ったNumberのコンストラクタ呼び出しを発見します。 It is a fast detector

]]>
このディテクタは、ダブルチェックロックを発見します。高速ディテクタです。

]]>
このディテクタは、finalize()呼び出し、及びファイナライザに関連した問題を発見します。高速ディテクタです。

]]>
このディテクタは、hashCode()とequals()メソッドの定義の問題を発見します。高速ディテクタです。

]]>
Looks for equals methods that override equals methods in a superclass where the equivalence relationship might not be symmetrical.

]]>
このディテクタは、オブジェクトの状態を変更していないのにnotify()メソッドを呼び出しているコードを発見します。高速ディテクタです。

]]>
このディテクタは変更可能なstaticデータを返すメソッドを発見します。高速ディテクタです。

]]>
このディテクタは、Thread.run()の呼び出しを発見します。高速ディテクタです。

]]>
このディテクタは、ループ内のスピンフィールド読みだしを発見します。高速ディテクタです。

]]>
このディテクタは、2つ以上のロックを保持した状態でのwait()呼び出しを発見します。低速ディテクタです。

]]>
このディテクタは、wait()が条件付き、もしくは無条件ループ内で呼び出されている事をチェックします。高速ディテクタです。

]]>
このディテクタは、コンストラクタ内での、未初期化フィールドの読み出しを発見します。高速ディテクタです。

]]>
このディテクタは、setメソッドが同期化されているが、getメソッドが同期化されてないケースを発見します。高速ディテクタです。

]]>
このディテクタは、潜在的な循環クラス初期化を発見します。高速ディテクタです。

]]>
このディテクタは、イテレータの実装方法の問題を発見します。高速ディテクタです。

]]>
このディテクタは、ロックの使用に関して、一貫性の無いやり方でフィールドにアクセスしているコードを発見します。高速ディテクタです。

]]>
このディテクタは、Stringオブジェクトを==や!=で比較しているコードを発見します。高速ディテクタです。

]]>
このディテクタは、変更されるフィールドが参照しているオブジェクトを使って同期化を行っているコードを発見します。高速ディテクタです。

]]>
This detector looks for code that seems to be synchronizing on a field in order to guard updates of that field.

]]>
このディテクタは、悪意を持ったコードによって変更されうるstaticフィールドを発見します。高速ディテクタです。

]]>
このディテクタは、名前付けが疑わしいメソッドを発見します。高速ディテクタです。

]]>
このディテクタは、InputStream.read()あるいは、InputStream.skip()の戻り値を無視しているコードを発見します。高速ディテクタです。

]]>
このディテクタは、直列化可能クラスの潜在的な実装の問題を発見します。高速ディテクタです。

]]>
このディテクタは、コンストラクタ内でのスレッドの開始を発見します。高速ディテクタです。

]]>
This detector looks for incorrect for loops.

]]>
このディテクタは、全く読み出されないフィールドを発見します。高速ディテクタです。

]]>
このディテクタは、ループ外で呼び出されているwait()を発見します。高速ディテクタです。

]]>
このディテクタは、戻り値が間違って無視されていると思われるメソッド呼び出しを発見します。低速ディテクタです。

]]>
このディテクタは、NullPointerExceptionが起きる可能性のある場所を発見します。また、無駄な参照変数とnullとの比較を発見します。低速ディテクタです。

]]>
このディテクタは、入出力ストリームオブジェクトが、あるメソッド内でだけ使われており、そのメソッドを起点とする全てのパスで、オブジェクトがクローズされている事を調べます。低速ディテクタです。

]]>
このディテクタは、配列を返すメソッドがnullを返すケースを発見します。一般にはnullではなくサイズ0の配列を返すのが良いとされます。高速ディテクタです。

]]>
このディテクタは何の効果もない制御フロー式を発見します。高速ディテクタです。

]]>
このディテクタは、獲得された JSR-166 (java.util.concurrent) ロックが、このメソッドを起点とする全てのパスで解放されているかどうか調べます。 中速ディテクタです。このディテクタを利用するには、 java.util.concurrent パッケージを外部クラスパスに指定する必要があります(このパッケージ自身を調査する場合を除く)。

]]>
このディテクタは、参照変数を == や != で比較しており、そのクラスが一般に、そのような比較が間違っている (例えば java.lang.Stringのように)ケースを発見します。低速ディテクタです。

]]>
このディテクタは、ロックされていないオブジェクトに対するwait(), notify(), notifyAll()呼び出しを発見します。中速ディテクタです。このディテクタは、現在開発中で、まだ間違った結果を多く出すためディスエーブルされています。

]]>
空のsynchronizedブロックを検出します。

]]>
このディテクタは、ロックのやり方が間違ったフィールドアクセスを発見します。低速ディテクタです。

]]>
このディテクタは、ローカル変数の自己代入を発見します。高速ディテクタです。

]]>
このディテクタは、疑わしいビット論理演算を発見します。高速ディテクタです。

]]>
このディテクタは、volatileでないフィールドの遅延初期化を発見します。中速ディテクタです。

]]>
このディテクタは、JSR166の通常のロックを発見します。中速ディテクタです。

]]>
このディテクタは、呼び出されないprivateメソッドを発見します。高速ディテクタです。

]]>
このディテクタは、ループ内で文字列を"+"を使って連結しているコードを発見します。高速ディテクタです。

]]>
このディテクタは、コレクションを配列に変換する際に、toArray()メソッドにサイズ0の配列を渡しているコードを発見します。高速ディテクタです。

]]>
このディテクタは、正しくないJUnitテストを検出します。高速ディテクタです。

]]>
このディテクタは、アダプタクラスを継承しているが、リスナメソッドを間違ったシグニチャでオーバーライドしているコードを検出します。高速ディテクタです。

]]>
このディテクタは、ResultSetのゲッタ、セッタメソッドを添字0でアクセスしているコードを検出します。ResultSetで使用する添字は1から始まるので、このコードは常に誤りです。高速ディテクタです。

]]>
このディテクタは、静的な型チェックが可能なのに、instanceofを使って型チェックを行なっているコードを検出します。高速ディテクタです。

]]>
このディテクタは、アプレットのスタブに依存したメソッドを継承クラスのコンストラクタが呼び出している箇所を発見します。こうしたメソッドのコンストラクタからの呼び出しは失敗します。なぜならアプレットのスタブはinit()メソッドが呼び出されるまでは初期化されないからです。高速ディテクタです。

]]>
このディテクタは、配列オブジェクトのequals(java.lang.Object)メソッドや、equalsメソッドをオーバーライドしていないfinalクラスのequalsメソッドの呼び出しを発見します。これらは意味的には==と同じであり、恐らく間違っていると思われます。

]]>
このディテクタは、非staticコンテキストでのThread.interrupted()呼び出しを発見します。Thread.currentThread().interrupted()といった呼び出しは、無駄でありThread.interrupted()で十分です。また、任意のスレッドオブジェクトに対して、interrupted()メソッドを呼び出すのは、ほぼ間違いなく誤りです。interrupted()メソッドは、常に自スレッドが割り込まれたかどうかを返します。

]]>
定数以外の文字列がSQLのStatementオブジェクトのexecuteに使用されているコードを発見するデータフロー解析を行ないます。

]]>
このディテクタは、その後読み出されることのないローカル変数への代入を発見します。final宣言されたローカル変数によって生成されるバイトコードが間違って検出されるケースがあるため、現在は、このディテクタは無効化されています。中速ディテクタです。

]]>
このディテクタは、クラスのフィールドが、メソッド内のローカル変数で隠されてしまっているコードを発見します。高速ディテクタです。

]]>
このディテクタは、keySetメソッドによって得たイテレータを使って取り出したキーを用いてMapの中身にアクセスしているコードを発見します。高速ディテクタです。

]]>
このディテクタはstaticメソッドしか定義されていないクラスのインスタンスを生成しているコードを発見します。高速ディテクタです。

]]>
このディテクタはtry節の中にExceptionをスローするコードが無いのにExceptionをキャッチしているcatch節を発見します。

]]>
このディテクタは、浮動小数の同値比較を発見します。高速ディテクタです。

]]>
このディテクタは、メソッドを起点とするパスの中にI/Oストリーム、データベースリソースのクリーンアップ処理を忘れているケースがあるコードを発見します。低速ディテクタです。

]]>
このディテクタは、java.lang.Mathのstaticメソッドを定数に対して呼び出して得た値を、定数として定義しているコードを発見します。計算後の値を定数として定義する方が、高速であり、また時として正確です。

]]>
このディテクタは、クラス間の循環依存関係を発見します。高速ディテクタです。

]]>
このディテクタは、親クラスが実装を宣言しているインターフェースを、自分でも宣言しているコードを発見します。既に親クラスが実装を宣言しているなら、サブクラスで同じインターフェースの実装を宣言するのは冗長です。

]]>
このディテクタは、Strutsフレームワークを実装する際の潜在的な問題を発見します。高速ディテクタです。

]]>
このディテクタは、公開クラスでthisに対する同期化、wait(), notify(), notifyAll()呼び出しを行なっているコードを発見します。このようなコードは、同期化の実装詳細を公開してしまいます。このクラスの利用者は、自分のクラスの中で、このクラスのインスタンスを同期化のために用いるかもしれず、ロジックを破壊に導くかもしれません。高速ディテクタです。

]]>
疑わしい戻り値の破棄を行なっているメソッド呼び出しを発見します。高速ディテクタです。

]]>
整数の除算結果をdoubleにキャストしているコードを発見します。プログラマの意図は大抵の場合、先にdoubleにキャストした後に除算を行なうことでしょう。高速ディクタです。

]]>
このディテクタはオブジェクト参照の間違ったキャストを発見します。

]]>
このディテクタはオブジェクト参照の間違ったキャストをデータフロー解析で行ないます。

]]>
このディテクタはHttpセッションへの直列化不可能なオブジェクトの格納を発見します。

]]>
このディテクタはObjectOutputのwriteObjectメソッドに直列化できないオブジェクトを渡しているコードを発見します。

]]>
このディテクタは文法が間違っている正規表現を発見します。

]]>
このディテクタは、Joshua BlochとNeal Gafterがプログラミングパズルで取り上げた細かな問題を発見します。

]]>
このディテクタはロックを保持したままThread.sleep()を呼び出しているコードを発見します。低速ディテクタです。

]]>
このディテクタは、if/elseもしくはswitch文の2つ条件分岐に同じコードが記述されていて条件テストの意味が無くなっている箇所を発見します。このようなケースは2つの条件分岐にコピーペーストを行ない、結果、片方のロジックを間違えてしまうことによって起こることがあります。

高速ディテクタです。

]]>
内部クラスがエンクロージングクラスのprivateフィールドに書き込んでいるコードを発見します。この場合フィールドへの書き込みを行なうためのアクセサメソッドをコンパイラが生成します。アクセス制限をprotectedに緩和することで、直接フィールドにアクセスするコードとすることができます。

高速ディテクタです。

]]>
このディテクタはXMLインターフェースの実装を直接生成しているコードを発見します。このようにFactoryを使わないコードは特定の実装に縛られてしまいます。

高速ディテクタです。

]]>
このディテクタはequals(Object)メソッドの実装のうち、引数を無条件に参照外ししているコードを発見します。このようなコードはjava.lang.Object.equals()で定義されている、null引数に対してfalseを返すことという規約に違反することになります。

低速ディテクタです。

]]>
このディテクタは親クラスのメソッドを子クラスで実装していて、そのメソッドが単に親クラスのメソッドにパラメータをそのまま渡しているだけのコードを発見します。これらは単純に削除可能です。

高速ディテクタです。

]]>
このディテクタはpreotectedなメンバを持ちながらfinal宣言されたクラスを発見します。このクラスは継承できないのですから、メンバをprotected宣言するのは間違いです。publicかprivate(訳注:かパッケージプライベート)に変更すべきです。クラスの使用方法が変わって、新しいパラダイムにクラスを変更する際、一部の変更を忘れたものと思われます。

高速ディテクタです。

]]>
このディテクタはbooleanの直定数が条件式の中でboolean変数に代入されているコードを発見します。

高速ディテクタです。

]]>
TrainNullReturnValuesはnullを返すかもしれないメソッドを発見し、その結果をファイルに保存します。この結果は後続のパスでnullの参照外しを発見するディテクタの精度を向上するために利用されるかもしれません。まだ習作の段階なので警告は何も出力しません。

低速ディテクタです。

]]>
TrainUnconditionalParamDerefsは引数を無条件に参照外ししているメソッドを発見し、その結果をファイルに保存します。この結果は後続のパスでnullの参照外しを発見するディテクタの精度を上げるために使用されるかもしれません。まだ習作の段階なので警告は何も出力されません。

低速ディテクタです。

]]>
TrainFieldStoreTypesディテクタはフィールドに格納される型を調査して、その結果をデータベースファイルに格納します。その結果は後続のパスでの型解析の精度を上げるために使用されるかもしれません。

低速ディテクタです。

]]>
TrainNonNullAnnotationsディテクタは@NonNullと@PossiblyNullアノテーションの指定を収集して結果をデータベースファイルに格納します。高速ディテクタです。

]]>
このディテクタはFindBugsの中でメソッド呼び出しの解決をデバッグするためだけに使用されます。イネーブルしないでください。

]]>
このディテクタは、分析結果の集計をとるために使用されます。

]]>
ASMバイトコード解析フレームワークを使用したディテクタの作成方法を示すためのサンプル。

]]>
このディテクタは、コンテナ内のjava.lang.Objectを受け取る汎用型メソッドの引数を調査し、これがコンテナの型パラメータと関連しているかチェックします。関係の無い型のオブジェクトをコンテナに格納することはできません。例えばfooList<String>であり、barStringBufferの場合、foo.contains(bar)は常にfalseを返します。高速ディテクタです。

]]>
This detector warns about static fields of type java.util.Calendar or java.text.DateFormat (and subclasses) because Calendars are inherently unsafe for multithreaded use.

]]>
This is an internal detector used only for testing dataflow analyses. It is not enabled by default.

]]>
Check for violations of properties specified by JSR-305 type qualifier annotations.

]]>
Looks for an attempt to append to an object output stream

]]>
Class too big for analysis {0} is too big for analysis
This class is bigger than can be effectively handled, and was not fully analyzed for errors.

]]>
Empty database password Empty database password in {1}
This code creates a database connect using a blank or empty password. This indicates that the database is not protected by a password.

]]>
Hardcoded constant database password Hardcoded constant database password in {1}
This code creates a database connect using a hardcoded, constant password. Anyone with access to either the source code or the compiled code can easily learn the password.

]]>
HTTP cookie formed from untrusted input HTTP cookie formed from untrusted input in {1}
This code constructs an HTTP Cookie using an untrusted HTTP parameter. If this cookie is added to an HTTP response, it will allow a HTTP response splitting vulnerability. See http://en.wikipedia.org/wiki/HTTP_response_splitting for more information.

FindBugs looks only for the most blatent, obvious cases of HTTP response splitting. If FindBugs found any, you almostly certainly have more vulnerabilities that FindBugs doesn't report. If you are concerned about HTTP response splitting, you should seriously consider using a commercial static analysis or pen-testing tool, such as those provided by Fortify Software, a sponsor of the FindBugs project. If your software is open source, Fortify will scan your code for free as part of the JOR (Java Open Review) effort.

]]>
HTTP Response splitting vulnerability HTTP parameter directly written to HTTP header output in {1}
This code directly writes an HTTP parameter to an HTTP header, which allows for a HTTP response splitting vulnerability. See http://en.wikipedia.org/wiki/HTTP_response_splitting for more information.

FindBugs looks only for the most blatent, obvious cases of HTTP response splitting. If FindBugs found any, you almostly certainly have more vulnerabilities that FindBugs doesn't report. If you are concerned about HTTP response splitting, you should seriously consider using a commercial static analysis or pen-testing tool, such as those provided by Fortify Software, a sponsor of the FindBugs project. If your software is open source, Fortify will scan your code for free as part of the JOR (Java Open Review) effort.

]]>
Servlet reflected cross site scripting vulnerability HTTP parameter written to Servlet output {1}
This code directly writes an HTTP parameter to Servlet output, which allows for a reflected cross site scripting vulnerability. See http://en.wikipedia.org/wiki/Cross-site_scripting for more information.

FindBugs looks only for the most blatent, obvious cases of cross site scripting. If FindBugs found any, you almostly certainly have more cross site scripting vulnerabilities that FindBugs doesn't report. If you are concerned about cross site scripting, you should seriously consider using a commercial static analysis or pen-testing tool, such as those provided by Fortify Software, a sponsor of the FindBugs project. If your software is open source, Fortify will scan your code for free as part of the JOR (Java Open Review) effort.

]]>
Servlet reflected cross site scripting vulnerability HTTP parameter written to Servlet error page in {1}
This code directly writes an HTTP parameter to a Server error page (using HttpServletResponse.sendError). Echoing this untrusted input allows for a reflected cross site scripting vulnerability. See http://en.wikipedia.org/wiki/Cross-site_scripting for more information.

FindBugs looks only for the most blatent, obvious cases of cross site scripting. If FindBugs found any, you almostly certainly have more cross site scripting vulnerabilities that FindBugs doesn't report. If you are concerned about cross site scripting, you should seriously consider using a commercial static analysis or pen-testing tool, such as those provided by Fortify Software, a sponsor of the FindBugs project. If your software is open source, Fortify will scan your code for free as part of the JOR (Java Open Review) effort.

]]>
JSP reflected cross site scripting vulnerability HTTP parameter directly written to JSP output, giving reflected XSS vulnerability in {1.class}
This code directly writes an HTTP parameter to JSP output, which allows for a cross site scripting vulnerability. See http://en.wikipedia.org/wiki/Cross-site_scripting for more information.

FindBugs looks only for the most blatent, obvious cases of cross site scripting. If FindBugs found any, you almostly certainly have more cross site scripting vulnerabilities that FindBugs doesn't report. If you are concerned about cross site scripting, you should seriously consider using a commercial static analysis or pen-testing tool, such as those provided by Fortify Software, a sponsor of the FindBugs project. If your software is open source, Fortify will scan your code for free as part of the JOR (Java Open Review) effort.

]]>
ある種のSwingのメソッドは、awtイベントディスパッチスレッドから呼び出す必要があります。 {1} でのSwingメソッド呼び出しは、awtイベントディスパッチスレッドから呼び出す必要があります。
(From JDC Tech Tip): に解説されている通り、Swingのメソッド、show、setVisible、packが呼び出されると、フレームのピアが生成されます。これにともない、システムは、イベントディスパッチスレッドを生成します。これが問題を引き起す事があります。なぜなら、イベントディパッチスレッドは、packとvalidateメソッドの実行中にもリスナを呼び出す事が可能だからです。これは、2つのスレッドが同時にSwingコンポーネントにアクセスする事態を招き、デッドロックや、その他のスレッドに関する問題を引き起す危険があります。packの呼び出しは、コンポーネントを実体化します。その途上で、リスナの呼び出しが、イベントディスパッチスレッドによって行なわれるかもしれません。

]]>
明かな無限ループ。 {1}の中に明らかな無限ループが存在します。
このループには(例外をスローする以外に)終了する術がありません。

]]>
明らかな無限再帰ループ。 {1}は、明らかな無限再帰ループです。
このメソッドは無条件に自分自身を呼び出しています。これは無限再帰ループでありスタックオーバーフローを招くと考えられます。

]]>
コンテナへの自分自身の格納。 {1}でコンテナへ自分自身を格納しています。
コンテナが自分自身に格納されています。結果としてhashCodeの呼び出しがStackOverflowExceptionを招きます。

]]>
配列の参照を格納するフィールドをvolatile宣言しても、配列の各要素はvolatileとしては扱われません。 {1} は配列の参照変数でvolatile宣言されていますが、配列の要素はvolatileとしては扱われません。
配列への参照変数がvolatile宣言されていますが、これは、あなたが意図した動作をしない可能性があります。配列の参照変数がvolatile宣言されている場合、この参照変数自体への書き込み、読み込みはvolatileとして扱われますが、配列の各要素はvolatileではありません。もしも配列の要素へのアクセスをvolatileとして扱いたいのであれば、Java 5.0で提供されるjava.util.concurrentパッケージに含まれるアトミック配列クラスを利用する必要があります。

]]>
クラスが継承されている場合GetResourceの呼び出しは安全ではありません。 {1} でGetResourceが使用されていますが、クラスが継承されている場合、これは安全ではありません。
this.getClass().getResource(...) の呼び出しは、別のパッケージに継承クラスがある場合には、予期しない結果をもたらす可能性があります。

]]>
Method with Boolean return type returns explicit null {1} has Boolean return type and returns explicit null
A method that returns either Boolean.TRUE, Boolean.FALSE or null is an accident waiting to happen. This method can be invoked as though it returned a value of type boolean, and the compiler will insert automatic unboxing of the Boolean value. If a null value is returned, this will result in a NullPointerException.

]]>
Synchronize and null check on the same field. In {1} the field {2.givenClass} is synchronized on and then checked if null.
Since the field is synchronized on, it seems not likely to be null. If it is null and then synchronized on a NullPointerException will be thrown and the check would be pointless. Better to synchronize on another field.

]]>
テスト。 {1}で生成されたテストの警告。
このバグパターンは、未完成のバグディテクタでテストのために使用されます。

]]>
Unknown bug pattern Unknown bug pattern BUG_PATTERN in {1}
A warning was recorded, but findbugs can't find the description of this bug pattern and so can't describe it. This should occur only in cases of a bug in FindBugs or its configuration, or perhaps if an analysis was generated using a plugin, but that plugin is not currently loaded. .

]]>
空のzipファイルエントリを作成しています。 {1}の中で空のzipファイルエントリを作成しています。
このコードではputNextEntry()closeEntry()呼び出しのすぐあとに呼び出しています。これは、空のzipファイルエントリを生成してしまいます。zipファイルへのエントリ書き込みはputNextEntry()closeEntry()の間に行う必要があります。

]]>
空のjarファイルエントリを作成しています。 {1}の中で空のjarファイルエントリを作成しています。
このコードではputNextEntry()closeEntry()呼び出しのすぐあとに呼び出しています。これは、空のjarファイルエントリを生成してしまいます。jarファイルへのエントリ書き込みはputNextEntry()closeEntry()の間に行う必要があります。

]]>
IllegalMonitorStateException の疑わしいキャッチ。 {1} での、IllegalMonitorStateException の疑わしいキャッチ。
IllegalMonitorStateExceptionは一般にはコーディングの問題(ロックを獲得せずにwait()、notify()を呼び出した場合)によって発生するもので、キャッチすべきではありません。

]]>
このメソッドはfloatの精度で演算を行っています。 {1} は、floatの精度で演算を行っています。
このメソッドはfloatの精度で演算を行っています。floatの精度は非常に誤差の多いものです。例えば16777216.0f + 1.0f は、16777216.0fとなります。doubleを替わりに用いる事を検討してください。

]]>
クラスは、Cloneable を実装していますが、clone メソッドを定義していないか使用しません。 クラス {0} は、Cloneable を実装していますが、clone メソッドを定義していないか使用しません。
クラスはCloneableを実装していますが、cloneメソッドを定義していないか使用しません。

]]>
Class defines clone() but doesn't implement Cloneable {0} defines clone() but doesn't implement Cloneable
This class defines a clone() method but the class doesn't implement Cloneable. There are some situations in which this is OK (e.g., you want to control how subclasses can clone themselves), but just make sure that this is what you intended.

]]>
clone()メソッドがsuper.clone()を呼び出していません。 {1}は、super.clone()を呼び出していません。
このクラスはclone()を定義していますが、super.clone()を呼び出しておらず、finalでもありません。 もしもクラス("B")が("A")を継承しており、サブクラスBがsuper.clone()を呼び出さないと、Bのclone()メソッドはAのインスタンスを返してしまいます。これはclone()メソッドの規約を満たしていません。

全てのclone()メソッドがsuper.clone()を呼び出すようになっていれば、Object.clone()が呼び出される事が保証され、正しい型のオブジェクトが返送されます。

]]>
Use of identifier that is a keyword in later versions of Java {1} uses {2} for a variable name, which is a keyword in later versions of Java
The identifier is a word that is reserversed as a keyword in later versions of Java, and your code will need to be changed in order to compile it in later versions of Java.

]]>
Use of identifier that is a keyword in later versions of Java {1} conflicts with a keyword in a more recent version of Java
This identifier is used as a keyword in later versions of Java. This code, and any code that references this API, will need to be changed in order to compile it in later versions of Java.

]]>
メソッドで例外を落としている可能性があります。 {1} は {2} を落としている可能性があります。
このメソッドは例外を握りつぶしている可能性があります。一般に、例外が発生したら何らかの形で報告するか、呼び出し元に渡すべきです。

]]>
メソッドで例外を無視している可能性があります。 {1} は {2} を無視している可能性があります。
このメソッドは例外を無視している可能性があります。一般に、例外が発生したら何らかの形で報告するか、呼び出し元に渡すべきです。

]]>
doPrivilegedブロックの中で呼び出さなければならないメソッドが呼び出されています。 {1} は {2} を呼び出していますが、これはdoPrivilegedブロックの中で呼び出さなければなりません。
このコードはセキュリティの許可チェックが必要なメソッドを呼び出しています。もしもこのコードにセキュリティ許可が与えられていても、セキュリティ許可を持たないコードから呼び出されるのであれば、doPrivilegedブロックの中から呼び出す必要があります。

]]>
クラスローダはdoPrivilegedブロックの中でのみ作成可能です。 {1} で作成されているクラスローダ {2} は、doPrivilegedブロックの中で実行する必要があります。
このコードはクラスローダを生成していますが、これはセキュリティマネージャを必要とします。このコード自体がセキュリティ許可を得る予定でも、セキュリティ許可を持たないコードから呼び出されるのであれば、クラスローダの生成コードは、doPrivilegedブロックの中で行う必要があります。 ]]>
クラスローダはdoPrivilegedブロックの中でのみ作成可能です。 {1} で作成されているクラスローダ {2} は、doPrivilegedブロックの中で実行する必要があります。
このコードはクラスローダを生成していますが、これはセキュリティマネージャを必要とします。このコード自体がセキュリティ許可を得る予定でも、セキュリティ許可を持たないコードから呼び出されるのであれば、クラスローダの生成コードは、doPrivilegedブロックの中で行う必要があります。 ]]>
クラスローダはdoPrivilegedブロックの中でのみ作成可能です。 {1} で作成されているクラスローダ {2} は、doPrivilegedブロックの中で実行する必要があります。
このコードはクラスローダを生成していますが、これはセキュリティマネージャを必要とします。このコード自体がセキュリティ許可を得る予定でも、セキュリティ許可を持たないコードから呼び出されるのであれば、クラスローダの生成コードは、doPrivilegedブロックの中で行う必要があります。 ]]>
イミュータブルクラスのフィールドはfinal宣言すべきです。 {0} はイミュータブルと宣言されているので、{1.givenClass} はfinal宣言すべきです。
このクラスにはnet.jcip.annotations.Immutableアノテーションが付けられており、全てのフィールドはfinal宣言しなければなりません。

]]>
Runnableが期待されるところにThreadを渡しています。 {1}で、Runnableが期待されるところにThreadを渡しています。
引数にRunnableを期待しているメソッドに対してThreadオブジェクトが渡されています。通常はこのような書き方はしません。ロジック上の間違い、予期しない挙動を招く可能性があります。

]]>
URLのMapやSetはパフォーマンスを悪化させます。 {1} は、それ自身がURLのMap、Setであるか、あるいはURLのMap、Setを利用しています。これはパフォーマンスの悪化を招きます。
このフィールドあるいはメソッドは、URLのMap、Setを使用しているか、URLのMap、Set自身です。URLのequals()とhashCode()は、ドメイン名の解決を行うため、パフォーマンスが大きく損われる可能性があります。詳細については、http://michaelscharf.blogspot.com/2006/11/javaneturlequals-and-hashcode-make.htmlを参照してください。 替わりにjava.net.URIを使用することを検討してください。

]]>
URLのequals()、hashCode()は、ブロックされます。 {1} で呼び出している {2} は、ドメイン名解決のためにブロックされます。
URLのquals()とhashCode()は、ドメイン名の解決を行うので、パフォーマンスが大きく損われる可能性があります。詳細はhttp://michaelscharf.blogspot.com/2006/11/javaneturlequals-and-hashcode-make.htmlを参照してください。 替わりにjava.net.URIを使用することを検討してください。

]]>
デフォルトのretentionレベルのアノテーションの有無をリフレクションで確認することはできません。 {1} でリフレクションを用いてアノテーションの有無を確認していますが、このアノテーションのretentionレベルはデフォルトになっています。
アノテーションが@Retentionアノテーションによって、デフォルトの「ソースのみ」設定以外に変更されていなければ、アノテーションはクラスファイルに格納されないので、リフレクションで(例えばisAnnotationPresentメソッドを用いて)参照することはできません。

]]>
System.exit(...)を呼び出しています。 {1} でSystem.exit(...)を呼び出していますが、これはVM全体を終了させてしまいます。
System.exit は、VM全体を終了させてしまいます。これは、本当に必要な場面限って 使用すべきです。このようなコードは、再利用性を損なう事があります。替りにRuntimeException をスローする事を検討してください。

]]>
危険なrunFinalizersOnExitメソッドの呼び出し。 {1} で危険なrunFinalizersOnExitメソッドを呼び出しています。
System.runFinalizersOnExit、Runtime.runFinalizersOnExitをどんな理由があろうと呼び出してはならない。これらは、 最も危険なJavaクラスライブラリのメソッドである。 -- Joshua Bloch

]]>
メソッドで非効率な new String(String) コンストラクタを呼び出しています。 {1} で非効率な new String(String) コンストラクタを呼び出しています。
java.lang.String(String)コンストラクタの呼び出しはメモリを浪費するだけです。このようにして生成されたオブジェクトと元のStringオブジェクトは機能的に区別が付きません。

]]>
メソッドで非効率な new String() コンストラクタを呼び出しています。 {1} で非効率な new String() コンストラクタを呼び出しています。
java.lang.Stringの引数無しコンストラクタの呼び出しはメモリを浪費するだけです。このようにして生成されたオブジェクトと、空文字列""の間には機能的に違いがありません。Javaは、同一内容の文字列定数のインスタンスを1つにまとめます。従って単に空文字列を直接使用すべきです。

]]>
StringのtoString()メソッドが呼び出されています。 {1} メソッドで、StringのtoString()メソッドが呼び出されています。
String.toString()を明示的に呼び出すのは冗長です。

元のStringをそのまま使用してください。

]]>
明示的にガベージコレクションを呼び出しています。ベンチマークのコード以外で記述されるのはきわめて疑わしいです。 {1} 明示的にガベージコレクションを呼び出しています。ベンチマークのコード以外で記述されるのはきわめて疑わしいです。
明示的にガベージコレクションを呼び出しています。ベンチマークで使用されるケースを除けば、これは大変疑わしいコードです。

過去において、close()やfinalize()メソッドでのガベージコレクションを明示的に呼び出すことが、パフォーマンスのブラックホールに陥れるケースがありました。ガベージコレクションは高くつく場合があります。数百、数千のガベージコレクション呼び出しは、システムのパフォーマンスを極めて落とす事になります。

]]>
メソッドで非効率なBooleanのコンストラクタを呼んでいます。その代わりにBoolean.valueOf(...) を使うべきです。 {1} で非効率なBooleanのコンストラクタを呼んでいます。その代わりにBoolean.valueOf(...) を使うべきです。
java.lang.Booleanのインスタンスを新規に生成するのはメモリの浪費です。Booleanクラスはイミュータブルなので、TRUEとFALSEの2つのオブジェクトがあれば十分です。 Boolean.valueOf()(あるいは、Java 5以上ならばオートボクシング)を替わりに使ってください。

]]>
非効率なNumberのコンストラクタが呼び出されています。valueOfスタティックメソッドを代わりに使用してください。 {1} メソッドは、非効率な {2} コンストラクタを使用しています。代わりに {3} を使用してください。
new Integer(int)の呼び出しは、常に新たなオブジェクトが生成されます。これに対してInteger.valueOf(int)は、コンパイラ、クラスライブラリ、JVMによってキャッシュすることが可能です。キャッシュを使用することによって、余計なオブジェクトの生成を防ぎ、コードの実行効率を改善できます。

-128から127までの値は、キャッシュされるので、valueOfを使用すると約3.5倍高速になります。この範囲外の場合にはパフォーマンスの差はありません。

バージョン5.0より前のJava実行環境との互換性が不要であれば、オートボクシングか、LongIntegerShortCharacterBytevalueOf()メソッドを代わりに使用してください。

]]>
非効率な浮動小数点数のコンストラクタを呼び出しています。valueOfスタティックメソッドを代わりに使用してください。 メソッド {1} で、非効率な {3} コンストラクタが呼び出されています。代わりに {4} を使用してください。
new Double(double)を呼び出すと、常に新たなオブジェクトが生成されます。これに対し、Double.valueOf(double)は、コンパイラ、クラスライブラリ、JVMによってキャッシュすることが可能です。キャッシュを使用することによって、余計なオブジェクトの生成を防ぎ、コードの実行効率を改善できます。

バージョン5.0より前のJava実行環境との互換性が不要であれば、オートボクシングか、DoubleFloatvalueOf()メソッドを代わりに使用してください。

]]>
メソッドは非効率なString.equals("")呼び出しを行っています。String.length() == 0を替わりに使用してください。 メソッド{1}は非効率なString.equals("")呼び出しを行っています。String.length() == 0を替わりに使用してください。
eauals()を使って空文字列との比較を行っています。length()メソッドを使って長さ0かどうか調べる方が高速です。また、このようにすることでクラスファイルから無駄な文字列を削除することが出来ます。

]]>
Localeを引数にとるメソッドの使用を検討してください。 ローカライズに対応していないString.toUpperCase()、String.toLowerCaseの使用。
文字列がプラットホームのデフォルトエンコーディングで、大文字、小文字に変換されています。これらは国際文字に対して行なわれると間違った結果を招くことがあります。かわりに

String.toUpperCase(Locale l)
String.toLowerCase(Locale l)

を使用してください。

]]>
Primitive value is unboxed and coerced for ternary operator Primitive value is unboxed and coerced for ternary operator in {1}
A wrapped primitive value is unboxed and converted to another primitive type as part of the evaluation of a conditional ternary operator (the b ? e1 : e2 operator). The semantics of Java mandate that if e1 and e2 are wrapped numeric values, the values are unboxed and converted/coerced to their common type (e.g, if e1 is of type Integer and e2 is of type Float, then e1 is unboxed, converted to a floating point value, and boxed. See JLS Section 15.25.

]]>
プリミティブ型の値が、ボクシングされた後、すぐにアンボクシングされています。 プリミティブ型の値が、ボクシングされた後、すぐにアンボクシングされています。
プリミティブ型の値がボクシングされた後、すぐにアンボクシングされています。これはアンボクシングされた値が必要な箇所で、手作業でボクシングしているために、コンパイラがただちにアンボクシングするコードを生成しているためと考えられます。

]]>
プリミティブ型の値が、ボクシングされた後に他のプリミティブ型に変換するためにアンボクシングされています。 プリミティブ型の値が、ボクシングされた後に他のプリミティブ型に変換するためにアンボクシングされています。
プリミティブ型の値が、ボクシングされた後に他のプリミティブ型に変換するためにアンボクシングされています(例:new Double(d).intValue())。プリミティブ型のみを用いて、直接型変換してください(例:(int) d)。

]]>
プリミティブ型のラッパクラスのインスタンスがtoStringを呼び出すためだけに生成されています。 {1} で、toStringを呼び出すためだけにプリミティブ型をボクシングしています。
プリミティブ型のラッパクラスのインスタンスがtoStringを呼び出すためだけに生成されています。これは、より効率的なプリミティブ型を引数にとるstaticなtoStringメソッドに置き替えることができます。

置換前置換後
new Integer(1).toString()Integer.toString(1)
new Long(1).toString()Long.toString(1)
new Float(1.0).toString()Float.toString(1.0)
new Double(1.0).toString()Double.toString(1.0)
new Byte(1).toString()Byte.toString(1)
new Short(1).toString()Short.toString(1)
new Boolean(true).toString()Boolean.toString(true)
]]>
クラスオブジェクトを得るためだけにインスタンス生成が行なわれています。 メソッド {1} は、クラスオブジェクトを得るためだけにインスタンス生成を行なっています。
このメソッドは、getClass()を呼び出すためだけに、インスタンスを生成しています。あるクラスのクラスオブジェクトを得るには、.classプロパティを使用した方が単純です。

]]>
Conditionオブジェクトに対するwait()呼び出し。 {1}でConditionオブジェクトに対するwait()呼び出しが行なわれています。
このメソッドはjava.util.concurrent.locks.Condition objectのwait()を呼び出しています。Conditionオブジェクトで待ち合わせる場合はConditionインターフェースに用意されたawait()のどれかを使用すべきです。

]]>
0から1の乱数値は整数では0に丸められます。 {1} で0から1の乱数値が生成されていますが、整数0に丸められます。
0から1の乱数値が生成されていますが、整数0に丸められます。恐らく丸めの前に何らかの値を掛けたかった、あるいはRandom.nextInt(n)メソッドを使用したかったのではありませんか?

]]>
整数の乱数値を得たいのであれば、nextDoubleではなくnextIntメソッドを使用してください。 メソッド {1} は、整数の乱数値を得るためにnextDoubleメソッドを使用しています。nextIntを使用した方が効率的です。
java.util.Randomのインスタンスrに対して0からn-1の乱数を得たいのであれば、(int)(r.nextDouble() * n)のかわりにr.nextInt(n)を用いることができます。

]]>
SQLのStatementオブジェクトのexecuteメソッドに定数でない文字列が渡されています。 {1}メソッドで、SQLのStatementのexecuteメソッドに定数でない文字列が渡されています。
このメソッドはSQLのStatementのexecuteメソッドに動的に生成された文字列を渡しているようです。替りにPreparedStatementを使用することを検討してください。この方が効率的でSQLインジェクションアタックに対してより安全です。

]]>
PreparedStatementが定数でないStringから生成されています。 {1} でPreparedStatementが定数でないStringから生成されています。
このコードはSQLのPreparedStatementを定数でないStringから生成しています。内容がチェックしないと、汚染されたユーザ入力が文字列に含まれてしまい、SQLインジェクションによって予期しない、望ましくない動作を招くかもしれません。

]]>
実行する内容を指定せずにThreadオブジェクトを生成しています。 メソッド {1} は、実行する内容を指定せずにThreadオブジェクトを生成しています。
このメソッドは、Theadインスタンスを生成していますが、Runnableオブジェクトも渡していなければ、runメソッドをオーバーライドした継承クラスも生成していません。このスレッドは無駄です。

]]>
フィールドのダブルチェックをおこなっている可能性があります。 {1} において {2} のダブルチェックをおこなっている可能性があります。
メソッド内にダブルチェックロッキングイディオムがあります。このイディオムはJavaのメモリーモデルでは正しく機能しません。詳細についてはhttp://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.htmlを参照してください。

]]>
Finalizer nulls fields {3} is set to null inside finalize method
This finalizer nulls out fields. This is usually an error, as it does not aid garbage collection, and the object is going to be garbage collected anyway. ]]>
Finalizer only nulls fields {1} only nulls fields
This finalizer does nothing except null out fields. This is completely pointless, and requires that the object be garbage collected, finalized, and then garbage collected again. You should just remove the finalize method. ]]>
finalizerはprotectedであるべきです。publicであるべきではありません。 {1} は public ですが、これは protected であるべきです。
このクラスのfinalize()メソッドはpublicになっていますが、protectedであるべきです。

]]>
空の finalizer は削除されるべきです。 {1} は空ですので、削除されるべきです。
空のfinalize()メソッドは無駄です。削除するべきです。

]]>
finalizerはスーパークラスの finalizer を無視しています。 {1} は {2}.finalize() を無視しています。これはわざとですか?
finalize()メソッドが空なので、親クラスのファイナライザを無視する事になり、親クラスで定義されたファイナライザの処理が呼び出されなくなってしまいます。そのような意図が無ければ、このメソッドを削除してください。

]]>
finalizerは単にスーパークラスのfinalizerを呼び出しているに過ぎません。 {1} は単に super.finalize() を呼び出しているだけで、それ以外のことはなにもしていません。これは削除されるべきです。
このfinalize()メソッドは、親クラスのfinalize()を呼び出しているだけで、無駄です。削除してください。

]]>
finalizerにスーパークラスのfinalizerの呼び出しの記述がありません。 {1} は super.finalize() の呼び出しを忘れています。そのため {2}.finalize() は呼び出されることがありません。
このfinalize()メソッドは、親クラスのfinalize()を呼び出していません。このため親クラスで定義されたファイナライズ処理が行われません。super.finalize()を呼び出すように変更してください。

]]>
finalizer を明示的に呼び出しています。 {1} は明示的に {2} を呼び出しています。
このメソッド内でfinalize()の明示的な呼び出しが行われています。ファイナライザは一度だけ呼び出されるべきで、それはVMによって行われるので、このコードの意図は間違っています。

もしも参照によってつながった複数のオブジェクトがファイナライズされると、それぞれのオブジェクトのfinalize()がVMから呼び出されますが、もしかすると別々のスレッドによって複数のfinalize()が同時に呼び出されるかもしれません。このため、あるクラスXのfinalize()の中から、別のオブジェクト(クラスXから参照されている)のfinalize()を呼び出すのは、とりわけ間違ったやり方です。なぜならすでにそのオブジェクトは別のスレッドでファイナライズ済みかもしれないからです。

]]>
タイプセーフenumに共変な equals() メソッドが定義されています。 タイプセーフenum {0} で、equals({0.givenClass}) を定義しています。
このクラスはタイプセーフenumを定義しており、同値性定義は、参照の一致によって決定しています。タイプセーフenumで共変なequals()メソッドを定義するのは、非常に悪い習慣です。なぜなら2つの異なる列挙定数が、通常のequals()では異なる値と判定されるのに、共変のequals()メソッドでは同値と判定されるかもしれないからです。

]]>
共変な equals() メソッドが定義されていますが、Object.equals(Object) が、そのまま継承されています。 {0} は equals({0.givenClass}) メソッドを定義していますが、Object.equals(Object) をそのまま利用しています。
このクラスには、引数がObjectでないequals()メソッドが定義されていますが、Objectクラスのequals(Object)が使用されています。 このクラスは、おそらく共変でないequals()を定義すべきです。 (すなわち、メソッドシグニチャを次のようにすべきです boolean equals(java.lang.Object)

]]>
equals() method defined that doesn't override Object.equals(Object) {0} defines {1.givenClass} method and uses Object.equals(Object)
This class defines an equals() method, that doesn't override the normal equals(Object) method defined in the base java.lang.Object class.  The class should probably define a boolean equals(Object) method.

]]>
equals() method defined that doesn't override equals(Object) {0} defines {1.givenClass} method that doesn't override equals(Object)
This class defines an equals() method, that doesn't override the normal equals(Object) method defined in the base java.lang.Object class.  Instead, it inherits an equals(Object) method from a superclass. The class should probably define a boolean equals(Object) method.

]]>
Class doesn't override equals in superclass {0} doesn't override {1.givenClass}
This class extends a class that defines an equals method and adds fields, but doesn't define an equals method itself. Thus, equality on instances of this class will ignore the identity of the subclass and the added fields. Be sure this is what is intended, and that you don't need to override the equals method. Even if you don't need to override the equals method, consider overriding it anyway to document the fact that the equals method for the subclass just return the result of invoking super.equals(o).

]]>
共変な equals() メソッドを定義しています。 {0} は equals({0.givenClass}) メソッドを定義していますが、 equals(Object) は宣言されていません。
このクラスには、引数がObjectでないequals()メソッドが定義されています。 java.lang.Objectequals()メソッドを正しくオーバーライドするには、equals()メソッドの引数は、java.lang.Objectでなければなりません。

]]>
equals method overrides equals in superclass and may not be symmetric {1.class} overrides equals in {2.class.givenClass} and may not be symmetric
This class defines an equals method that overrides an equals method in a superclass. Both equals methods methods use instanceof in the determination of whether two objects are equal. This is fraught with peril, since it is important that the equals method is symetrical (in other words, a.equals(b) == b.equals(a)). If B is a subtype of A, and A's equals method checks that the argument is an instanceof A, and B's equals method checks that the argument is an instanceof B, it is quite likely that the equivalence relation defined by these methods is not symmetric.

]]>
equals method fails for subtypes {1} fails for subtypes
This class has an equals method that will be broken if it is inherited by subclasses. It compares a class literal with the class of the argument (e.g., in class Foo it might check if Foo.class == o.getClass()). It is better to check if this.getClass() == o.getClass().

]]>
Unusual equals method {1} is unusual
This class doesn't do any of the patterns we recognize for checking that the type of the argument is compatible with the type of the this object. There might not be anything wrong with this code, but it is worth reviewing.

]]>
equals method compares class names rather than class objects {1} compares class names rather than class objects
This method checks to see if two objects are the same class by checking to see if the names of their classes are equal. You can have different classes with the same name if they are loaded by different class loaders. Just check to see if the class objects are the same.

]]>
equals method always returns true {1} always returns true
This class defines an equals method that always returns true. This is imaginative, but not very smart. Plus, it means that the equals method is not symmetric.

]]>
equals method always returns false {1} always returns false
This class defines an equals method that always returns false. This means that an object is not equal to itself, and it is impossible to create useful Maps or Sets of this class. More fundementally, it means that equals is not reflexive, one of the requirements of the equals method.

The likely intended semantics are object identity: that an object is equal to itself. This is the behavior inherited from class Object. If you need to override an equals inherited from a different superclass, you can use use:

public boolean equals(Object o) { return this == o; }

]]>
複数のクラスに巨大な文字列定数が重複して存在しています。 {1} は長さ {2} の文字列として {3} つのクラス内に重複しています。
複数のクラスに巨大な文字列定数が重複して存在しています。これはもしかすると、finalフィールドが持つ文字列定数が、利用者側にクラスファイルに埋め込まれるJavaの特性によるものかもしれません。詳細、回避方法については、JDK bug 6447475を参照してください。これによってJDKのサイズを1MByte減らすことができました。

]]>
メソッドで引数のnullチェックが行われていません。 {1} で引数のnullチェックが行われていません。
このメソッド引数は、nullチェックが必要と認識されていますが、チェック無しに参照外しされています。

]]>
equals() メソッドでnull引数をチェックしていません。 {1} は、null引数のチェックをしていません。
この equals(Object) の実装では引数のnullチェックをしておらず、java.lang.Object.equals() の規約に違反しています。equals()は、null引数に対してfalseを返さなければなりません。

]]>
equals() メソッドがnull引数をチェックしていません。 {1} でnull引数をチェックしていません。
このequals(Object)実装は引数にnullが渡された場合のチェックが行なわれていないため、java.lang.Object.equals()で定義された契約を破っています。全てのequals()メソッドは引数にnullが渡された場合にfalseを返さなければなりません。

]]>
共変な compareTo() メソッドが定義されています。 {0} は compareTo({0.givenClass}) メソッドを定義していますが、 comparesTo(Object) は定義されていません。
このクラスは、引数がjava.lang.ObjectでないcompareTo()メソッドを定義しています。 ComparableインターフェースのcompareTo()メソッドを正しく実装するには、compareTo()メソッドの引数の型は、java.lang.Objectでなければなりません。

]]>
hashCode()を持たないクラスをハッシュで使用しています。 {2} はhashCode()メソッドを定義していませんがハッシュで使用しています。
このクラスは equals(Object) を定義していますが hashCode() を定義していません。このため、同値のオブジェクトが等しいhashCode()を返さなければいけないという規約を満たしていません。しかも、このインスタンスは実際にハッシュに利用されています。早急にこのクラスを修正してください。 ]]>
クラスで hashCode() を定義していますが、 Object.equals() はそのまま使っています。 {0} は hashCode を定義していますが、 Object.equals() はそのまま使っています。
このクラスはhashCode()メソッドを定義していますが、equals()メソッドはjava.lang.Objectのもの(参照が同一かどうかで同値性を判定します)をそのまま利用しています。これは、同値であると判定されたオブジェクトが同じハッシュコードを返さなければならないという規約は満たしますが、恐らくhashCode()メソッドのオーバーライドは意図されたものでは無いと思われます(hashCode()のオーバーライドは、単なる参照が同一という同値性よりも複雑な基準がある事を意味します)。

もしもこのクラスのインスタンスがHashMap/HashTableに挿入されることがあり得ないと考えるのであれば、推奨されるhashCodeの実装は次のようになります。

public int hashCode() {
  assert false : "hashCodeが呼び出されることは想定されていません。";
  return 42; // 適当な値
}

]]>
compareTo(...)を宣言し、Object.equals()を使用しています。 {0} は、{1.givenClass}を宣言しObject.equals()を使用しています。
このクラスは、compareTo(...)を宣言していますがequals()java.lang.Objectから継承しています。一般にcompareToが0を返す条件は、equalsがtrueを返す条件と一致する必要があります。これを守らないと複雑で予測不可能な問題が、例えばPriorityQueueで発生するでしょう。Java 5では、PriorityQueue.remove()は、compareTo()を使用していますがJava 6では、equals()を使用しています。

ComparableインターフェースのcompareToメソッドのJavaDocを以下に引用します。

必須というわけではありませんが、(x.compareTo(y)==0) == (x.equals(y))であることが強く推奨されます。一般に、Comparable インタフェースを実装しているクラスで、この条件に違反するクラスはすべて、明確にこの事実を示す必要があります。「注:このクラスは equals と一貫性のない自然順序付けを持ちます」などと明示することをお勧めします。
]]>
クラスで hashCode() を定義していますが、equals() は定義していません。 {0} は hashCode を定義していますが、equals は定義していません。
このクラスはhashCode()メソッドを定義していますが、equals()メソッドを定義していません。このため、同値のオブジェクトは同じハッシュコードを返すべきという規約を破る可能性があります。

]]>
クラスで equals() を定義していますが、Object.hashCode() はそのまま使っています。 {0} で equals を定義していますが、Object.hashCode() はそのまま使っています。
このクラスはequals(Object)をオーバーライドしていますが、hashCode()をオーバーライドしていないので、java.lang.ObjecthashCode()の実装をそのまま利用しています(これは、VMがObjectに割り当てた一意のハッシュコードを返します)。このため、同値のオブジェクトが等しいハッシュコードを返さなければならないという規約を破る可能性が非常に高いです。

もしもこのクラスのインスタンスがHashMap/HashTableに挿入されることがあり得ないと考えるのであれば、推奨されるhashCodeの実装は次のようになります。

public int hashCode() {
  assert false : "hashCodeが呼び出されることは想定されていません。";
  return 42; // 適当な値
}
]]>
クラスは、equals()を継承し、Object.hashCode()をそのまま使用しています。 {0}は、equals()を継承し、Object.hashCode()をそのまま使用しています。
このクラスはequals(Object)を親の抽象クラスから継承しhashCode() は、java.lang.Objectクラスのものをそのまま使用しています(これは、VMによってアサイン された任意の値を返送します)。このクラスは「等しいオブジェクトが、同値のハッシュコードを返さなければならない」 という契約を満たすのが非常に困難になっています。

もしもhashCodelを定義する必要がない、あるいはこのオブジェクトをHashMap/Hashtableに格納したく ないと考えるのであれは、hashCode()メソッドをUnsupportedOperationExceptionを スローするように実装してください。

]]>
クラスで equals() を定義していますが hashCode() は定義していません。 {0} は equals を定義していますが hashCode は定義していません。
このクラスはequals(Object)をオーバーライドしていますが、hashCode()をオーバーライドしていません。このため、このクラスは同値のオブジェクトが等しいハッシュコードを返さなければならないという規約を破る可能性があります。

]]>
抽象クラスで共変な equals() メソッドを宣言しています。 抽象クラス {0} で equals({0.givenClass}) メソッドを宣言しています。
このクラスには、引数がObjectでないequals()メソッドが定義されています。 java.lang.Objectequals()メソッドを正しくオーバーライドするには、equals()メソッドの引数は、java.lang.Objectでなければなりません。

]]>
文字列を == や != を用いて比較しています。 {1}の中で、文字列オブジェクトを == や != を使って比較しようとしています。
このコードはjava.lang.Stringのオブジェクトは==もしくは!=を使って参照の比較を行っています。定数定義された文字列もしくは、String.intern()で得られた文字列でなければ、同じ内容でも別のオブジェクトとなる可能性があります。equals(Object)メソッドを替わりに用いる事を検討してください。

]]>
文字列引数の ==、!=による比較。 {1}で、文字列引数を == 、!= で比較しています。
このコードはjava.lang.Stringのパラメータを==、!=を使用して比較しています。これは呼び出し元が文字列定数か、internされた文字列しか渡せないことを意味しており、非常に脆いものになっています。このようにしても実行効率上のメリットはほとんどありません。equals(Object)を代わりに使用することを検討してください。

]]>
抽象クラスで共変な compareTo() メソッドを宣言しています。 抽象クラス {0} で compareTo({0.givenClass}) メソッドを宣言しています。
このクラスは、引数がjava.lang.ObjectでないcompareTo()メソッドを定義しています。 ComparableインターフェースのcompareTo()メソッドを正しく実装するには、compareTo()メソッドの引数の型は、java.lang.Objectでなければなりません。

]]>
フィールドが同時並行アクセスに対して無防備です。 {1.givenClass} は同時並行アクセスに対して無防備です({2}% 期間のロック)。
このフィールドにはnet.jcip.annotations.GuardedByアノテーションが付けられていますが、そのアクセスのされ方は、アノテーションが定めたルールを破っているようです。

]]>
Mutable servlet field {1} is a mutable servlet field
A web server generally only creates one instance of servlet or jsp class (i.e., treates the class as a Singleton), and will have multiple threads invoke methods on that instance to service multiple simultaneous requests. Thus, having a mutable instance field generally creates race conditions. ]]>
同期化が考慮されていません。 {1} の同期化が考慮されていません。{2}% がロックされている時に。
このクラスのフィールドは、同期化の観点から、一貫したアクセスが行われていないようです。このバグレポートは、次のようなバグパターンを示します。
  1. クラス内でアクセスする際に、ロックしたりしていなかったりしており、
  2. 最低でも1つのロックされたアクセスがクラス内のメソッドから行われており、
  3. 書き込みに対して、読み込みの2倍の重み付けをした場合に、ロックしていないフィールドアクセス(読み書き)の数が、全体のアクセス数の1/3を超えていない

このパターンに当てはまる典型的な例は、スレッドセーフを意図しているのに、メソッドを同期化するのを忘れているケースです。

ディテクタにコードの意図を伝えるため「非同期アクセス」のラベルを付ける事ができます。

このディテクタには、判断を誤る要因が幾つかあります。例えば、ディテクタはスレッドがロックを獲得しているかどうかを、コードを見て静的に判断する事は出来ません。例えディテクタが、ロックされたアクセスと、そうでないアクセスを的確に判定出来たとしても、依然としてコードが正しい可能性は残ります。

ここの記述は"IS2"バージョンのパターンディテクタを参考にしています。これは、ロック・非ロックアクセスの検出に関して"IS"バージョンよりも正確です。

]]>
裸の notify。 {1} の中に裸の notify があります。
オブジェクトの状態を変更せずにnotify()もしくはnotifyAll()メソッドを呼び出しています。一般にはこれらのメソッドは、別のスレッドが待ち合わせている条件が成立したのを知らせるために用いられます。条件の待ち合わせを行うためには、両方のスレッドから見る事が可能なヒープオブジェクトを使用しなければなりません。

このバグ報告は、必ずしもプログラミングエラーを意味しません。オブジェクトの状態変更がメソッド内部で行われ、そこから更にnotify()/notifyall()メソッドを持ったメソッドを呼び出しているかもしれないからです。

]]>
public static なメソッドで配列を戻り値として返すと、内部表現を暴露してしまう可能性があります。 public static な {1} メソッドで {2.givenClass} を戻すことにより、内部表現を暴露してしまう可能性があります。
public staticメソッドが、クラスのstaticフィールドに保持した配列を返しています。このメソッドを呼び出して得られた配列への参照を通じて、クラスのstaticフィールドを変更出来ていまいます。1つの修正方法は防御的コピーを行って、配列の複製を返す事です。

]]>
メソッドは変更可能なオブジェクトの参照を返すことにより内部表現を暴露しています。 {1} は {2.givenClass} を戻すことにより内部表現を暴露してしまう可能性があります。
オブジェクトのフィールドに格納された変更可能なオブジェクトの参照を返すと、オブジェクトの内部表現を暴露してしまいます。もしも、このオブジェクトが信頼されていないコードによってアクセスされる事が、セキュリティや、その他の重要な情報への脅威となる可能性があるため、このコードは修正すべきです。防御的コピーを行って、複製を返すのが、多くの場面で良いやり方です。

]]>
可変オブジェクトへの参照を自らに格納してしまうことにより内部表現を暴露してしまう可能性があります。 {1} は {2.givenClass} の中に外部の可変オブジェクトを格納することにより内部表現を暴露してしまう可能性があります。
このコードは、外部の変更可能オブジェクトを自らの実装に格納しています。もしもこのオブジェクトが信頼されていないコードによってアクセスされると、セキュリティや、その他の重要な情報への脅威となる可能性があるため、このコードは修正すべきです。防御的コピーを行って、複製を返すのが、多くの場面で良いやり方です。

]]>
ミュータブルなオブジェクトをstaticフィールドに格納する事で、内部の状態を外部に晒す危険があります。 {1} は、ミュータブルオブジェクトをstaticフィールド {2} に格納する事で、内部の状態を、外部に晒す危険があります。
このコードは、外部から変更可能なオブジェクトをstaticフィールドに格納しています。ミュータブルオブジェクトのチェックされない変更が、セキュリティや、重要な情報を危機に晒す可能性があるなら、違うやり方を検討してください。防御的コピーは、一つの良いアイデアです。

]]>
スレッドの中で run を実行しています。(本当は startを代わりに呼び出すべきではないのですか?)。 {1} は明示的にスレッドの run を呼び出しています。(本当は start を呼び出したいと思ったのではないですか?)
このメソッドは、オブジェクトのrun()メソッドを明示的に呼び出しています。一般にRunnableを実装したクラスは、新しいスレッドがrun()メソッドを呼び出す事を期待しており、この場合、Thread.start()を呼び出すのが正しいやり方です。

]]>
メソッドはフィールドのスピンロックを利用しています。 {2.givenClass} を使って {1} でスピンロックを使っています。
このメソッドは、フィールドの値をループの終了条件としていますが、仕様上、コンパイラはフィールドの読み出しをループの外に出しても良い事になっています。このためループは無限ループとなる可能性があります。フィールド読みだしを正しく同期化(wait/notify)する事が必要です。

]]>
潜在的な非短絡論理の危険な使用。 {1}で潜在的な非短絡論理の危険な使用が見られます。
このコードは、短絡論理(&& or ||)の代わりに非短絡論理を使用しています。更に、左側の値によっては、右側の評価を(例外の送出や高コストの演算といった副作用があるために)避けたいケースがあるようです。

非短絡論理は、両側の式が評価されます。それはたとえ左側だけで結果が決定してしまう場合にもです。これは効率が悪く、左側がガード条件になっている場合には、右側の評価でエラーが発生するかもしれません。

詳細はJava言語仕様を参照してください。

]]>
非短絡的ロジックの疑わしい使用。 {1} での非短絡的ロジックの疑わしい使用。
非短絡的演算子(&あるいは|)を、短絡的演算子(&&あるいは||)と間違えて使用しているようです。非短絡的演算子は、両側の式を必ず評価します。非短絡的演算子を短絡的演算子のかわりに使うと、効率が悪いだけでなく、もしも演算子の左側の式が右側の式にアクセスするためのガード条件になっている場合には、エラーになります。

詳細については、Java言語仕様を参照してください。

]]>
2つのロックを持ったまま wait しています。 {1} で2つのロックを持ったまま wait() しています。
2つ以上のロックを獲得した状態でモニタの上で待ち合わせを行うと、デッドロックする場合があります。wait()メソッドは、呼び出されたオブジェクトのロックのみを解放するだけで、その他のロックは解放しません。これは必ずしもバグとは限りませんが、詳しく検討すべきです。

]]>
2つのロックを保持したままでのnotify。 {1} で2つのロックを保持したままnotify()あるいはnotifyAll*()を実行しています。
このコードは2つのロックを保持したままnotify()あるいはnotifyAll()を呼び出しています。もしもwait()を呼び出しているスレッドが同じロックを保持しているなら、これはデッドロックに陥いる危険があります。なぜならwait呼び出しは1つのロックだけを解放するので、notifyによって2つのロックを獲得することは無いからです。このためnotifyは、意図通りには動作しないでしょう。もしも「2つのロックを持ったまま wait しています。」の警告も同時に出ているのであれば、バグの可能性が極めて高いと言えます。

]]>
waitに条件文がありません。 {1} のwaitに条件文がありません。
このメソッドの中でjava.lang.Object.wait()を呼び出していますが、条件判断によってガードされていません。wait()を呼び出す前に、待ち条件が既に成立していないかどうか、調査する必要があります。wait()呼び出し前に行われた通知は無視されてしまいます。

]]>
コンストラクタで初期化前のフィールドを読んでいます。 {2.name} を {1} で初期化前に値を読み込んでいます。
このコンストラクタは、まだ何も値が代入されていないフィールドを読み込んでいます。これはしばしば、プログラマが間違えてコンストラクタのパラメータのかわりに、フィールドにアクセスしてしまった場合に起こります。

]]>
getメソッドは同期化(synchronized)されていませんが、setメソッド同期化されています。 {1} は同期化(synchronized)されていませんが、{2} は同期化されています。
このクラスには似た名前のgetメソッドとsetメソッドがあり、setメソッドは同期化されていますが、getメソッドは同期化されていません。これは、getメソッドの呼び出しによって、必ずしも最新のオブジェクトの内容が見えるとは限らないため、実行時に、正しくない挙動を招く場合があります。getメソッドも同期化するべきです。

]]>
初期化がループしています。 {0} と {1} の間で初期化がループしています。
2つのクラスの静的初期化子が循環参照しています。様々な予測出来ない挙動が起こる可能性があります。

]]>
親クラスが初期化の際に子クラスを使用しています。 {0} の初期化にあたり、まだ初期化されていない {2} を使用しています。
あるクラスの初期化の間に子クラスを使用しています。子クラスはまだこの段階では初期化されていません。例えば、以下の例では、fooは、まだnullの状態になるでしょう。

public class CircularClassInitialization {
	static class InnerClassSingleton extends CircularClassInitialization {
		static InnerClassSingleton singleton = new InnerClassSingleton();
	}
	
	static CircularClassInitialization foo = InnerClassSingleton.singleton;
}
]]>
iterator の next() メソッドが NoSuchElement 例外をthrowすることができません。 {1} は NoSuchElement 例外をthrowすることができません。
このクラスはjava.util.Iteratorを実装していますが、next()メソッドがjava.util.NoSuchElementExceptionをスロー出来ないようになっています。next()メソッドは、もう返送出来るエレメントが無くなった際にNoSuchElementExceptionをスローしなければなりません。

]]>
Synchronization on interned String could lead to deadlock Synchronization on interned String could deadlock in {1}
The code synchronizes on interned String.
private static String LOCK = "LOCK";
...
  synchronized(LOCK) { ...}
...

Constant Strings are interned and shared across all other classes loaded by the JVM. Thus, this could is locking on something that other code might also be locking. This could result in very strange and hard to diagnose blocking and deadlock behavior. See http://www.javalobby.org/java/forums/t96352.html and http://jira.codehaus.org/browse/JETTY-352.

]]>
Synchronization on Boolean could lead to deadlock Synchronization on Boolean could deadlock in {1}
The code synchronizes on a boxed primitive constant, such as an Boolean.
private static Boolean inited = Boolean.FALSE;
...
  synchronized(inited) { 
    if (!inited) {
       init();
       inited = Boolean.TRUE;
       }
     }
...

Since there normally exist only two Boolean objects, this code could be synchronizing on the same object as other, unrelated code, leading to unresponsiveness and possible deadlock

]]>
Synchronization on boxed primative values Synchronization on {2} in {1}
The code synchronizes on an apparently unshared boxed primitive, such as an Integer.
private static final Integer fileLock = new Integer(1);
...
  synchronized(fileLock) { 
     .. do something ..
     }
...

It would be much better, in this code, to redeclare fileLock as

private static final Object fileLock = new Object();
The existing code might be OK, but it is confusing and a future refactoing, such as the "Remove Boxing" refactoring in IntelliJ, might replace this with the use of an intern'd Integer object shared throughout the JVM, leading to very confusing behavior and potential deadlock.

]]>
Synchronization on boxed primative could lead to deadlock Synchronization on {2} could deadlock in {1}
The code synchronizes on a boxed primitive constant, such as an Integer.
private static Integer count = 0;
...
  synchronized(count) { 
     count++;
     }
...

Since Integer objects can be cached and shared, this code could be synchronizing on the same object as other, unrelated code, leading to unresponsiveness and possible deadlock

]]>
空のsynchronizedブロック。 {1}に空のsynchronizedブロックがあります。
空のsynchronizedブロック:

synchronized() {}

空のsynchronizedブロックは難解で、考えられている程利用は容易ではありません。また少々ぶかっこうなコードになっても大抵の場合、空のsynchronizedブロックを使用しない方が、より優れたコードになります。

]]>
同期の取り方に統一感がありません。 {1} の同期の取り方に統一感がありません。{2}% の場合同期アクセスされています。
このクラスのフィールドは、同期化の観点から、一貫したアクセスが行われていないようです。このバグレポートは、次のようなバグパターンを示します。
  1. クラス内でアクセスする際に、ロックしたりしていなかったりしており、
  2. 最低でも1つのロックされたアクセスがクラス内のメソッドから行われており、
  3. 書き込みに対して、読み込みの2倍の重み付けをした場合に、ロックしていないフィールドアクセス(読み書き)の数が、全体のアクセス数の1/3を超えていない

このパターンに当てはまる典型的な例は、スレッドセーフを意図しているのに、メソッドを同期化するのを忘れているケースです。

このディテクタには、判断を誤る要因が幾つかあります。例えば、ディテクタはスレッドがロックを獲得しているかどうかを、コードを見て静的に判断する事は出来ません。例えディテクタが、ロックされたアクセスと、そうでないアクセスを的確に判定出来たとしても、依然としてコードが正しい可能性は残ります。

]]>
Synchronization on field in futile attempt to guard that field Synchronization on {2.givenClass} in futile attempt to guard it
This method synchronizes on a field in what appears to be an attempt to guard against simultaneous updates to that field. But guarding a field gets a lock on the referenced object, not on the field. This may not provide the mutual exclusion you need, and other threads might be obtaining locks on the referenced objects (for other purposes). An example of this pattern would be:

private Long myNtfSeqNbrCounter = new Long(0);
private Long getNotificationSequenceNumber() {
     Long result = null;
     synchronized(myNtfSeqNbrCounter) {
         result = new Long(myNtfSeqNbrCounter.longValue() + 1);
         myNtfSeqNbrCounter = new Long(result.longValue());
     }
     return result;
 }

]]>
メソッドは更新されるフィールドを使って同期しています。 {1} は更新されるフィールド {2.givenClass} を使って同期しています。
このメソッドは、変更可能なフィールドが参照しているオブジェクトを同期化しています。このコードの意図は、うまく実現されないと思われます。なぜなら、別のスレッドは、別のオブジェクトで同期化を行ってしまうかもしれないからです。

]]>
フィールドはinterfaceから取り出してパッケージプライベートにすべきです。 {1} はinterfaceから取り出してパッケージプライベートにすべきです。
インターフェースに定義されたfinal staticフィールドが、配列やhashtableのような変更可能オブジェクトを参照しています。このオブジェクトは、悪意を持ったコードによって、あるいは間違って、別のパッケージから書き換えてしまう事が可能です。このフィールドをクラスに移し、パッケージプライベートにする事で、この問題を解決してください。

]]>
フィールドはfinal 且つ パッケージプライベートにすべきです。 {1} フィールドはfinal 且つ パッケージプライベートにすべきです。
変更可能なstaticフィールドは、悪意を持ったコードによって、あるいは間違って、別のパッケージから書き換えられてしまう可能性があります。フィールドは、パッケージプライベートにするか、final宣言して(あるいは、この両方を行って)ください。

]]>
フィールドは final ではありませんが、finalに変更すべきです。 {1} はfinalではありませんがfinalに変更すべきです。
変更可能なstaticフィールドは、悪意を持ったコードによって、あるいは間違って、別のパッケージから書き換えられてしまう可能性があります。フィールドをfinalとする事で、この脆弱性を回避出来ます。

]]>
フィールドはパッケージプライベートにすべきです。 {1} はパッケージプライベートにすべきです。
変更可能なstaticフィールドは、悪意を持ったコードによって、あるいは間違って書き換えられてしまう可能性があります。フィールドをパッケージプライベートにすることで、この脆弱性を回避出来ます。

]]>
フィールドは変更可能なHashtableです。 {1} は変更可能なHashtable です。
final宣言されたstaticフィールドがHashtableの参照を保持しています。このフィールドは悪意を持ったコード、あるいは間違って別のパッケージからアクセス可能で、中身を自由に書き換える事が出来てしまいます。

]]>
フィールドは mutable な配列です。 {1} は mutable な配列です。
final宣言されたstaticフィールドが配列の参照を保持しています。このフィールドは悪意を持ったコード、あるいは間違って別のパッケージからアクセス可能で、配列の中身を自由に書き換える事ができてしまいます。

]]>
フィールドはfinalではないため、悪意を持ったコードから保護する事は出来ません。 {1}はfinalではないため、悪意を持ったコードから保護する事は出来ません。
書き換え可能なstaticフィールドは、悪意を持ったコードから、あるいは、間違って別のパッケージから書き換える事が可能です。残念ながら、このようなフィールドを、簡単に保護する事は出来ません。

]]>
呼び出されているメソッドは、継承されたものなのか外部のものなのか、あいまいです。 {1}のメソッド{2}は、継承されたものなのか、外部のものなのかが、あいまいです。
内部クラスの中で呼び出されているメソッドは、継承元のクラスのメソッドともエンクロージングクラスのメソッドのどちらともとれます。Javaの仕様上は継承されたクラスを呼び出しますが、この動作はプログラマの意図とは異なるかもしれません。もしも継承元クラスのメソッドを呼び出したいのであれば、superを付けることで(例:super.foo(17))、このコードを読む人とFindBugsに、エンクロージングクラスのメソッドではなく、継承元のメソッドを呼びたいという意図を明確にすることができます。

]]>
Class names shouldn't shadow simple name of superclass The class name {0} shadows the simple name of the superclass {1}
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.Foo extends beta.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.

]]>
Class names shouldn't shadow simple name of implemented interface The class name {0} shadows the simple name of implemented interface {1}
This class/interface has a simple name that is identical to that of an implemented/extended interface, except that the interface is in a different package (e.g., alpha.Foo extends beta.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.

]]>
クラス名は大文字で始めるべきです。 クラス名 {0} が大文字で始まっていません。
クラス名には名詞を採用し、構成単語の最初の文字を大文字として、残りを小文字とすべきです。クラス名は単純明解であるよう心がけてください。頭文字や略語の使用は避けてください(ただし一般に広く用いられているURLやHTMLといったものは構いません)。

]]>
メソッド名は、小文字で始めるべきです。 メソッド名 {1} が小文字で始まっていません。
メソッド名には動詞を採用し、メソッド名の最初の文字以外の構成単語の最初の文字を大文字として、残りを小文字とすべきです。

]]>
フィールド名は、小文字で始めるべきです。 フィールド名 {1} が小文字で始まっていません。
finalでないフィールド名は、最初の文字以外の構成単語の最初の文字を大文字として、残りを小文字とすべきです。

]]>
メソッドの命名が大変まぎらわしいです。 {1} と {3} のメソッドは、とても混乱しがちです。
これらのメソッド名は、大文字小文字が違う、あるいは引数のパッケージ名のみが異なるだけです。これらのメソッドは継承関係にあるクラスに宣言されているため、大変まぎらわしいです。

]]>
まぎらわしい命名 (意図的) (おそらく意図的ではありますが){1}と{3}は、非常にまぎらわしい名前です。
これらのメソッドは、大文字小文字のみが異なる名前を持っているか、あるいは引数のパッケージ名のみが異なります。大文字小文字が一致していれば、一方が他方をオーバーライドしていたはずで、非常にまぎらわしい命名になっています。他のメソッドの存在から、これらのメソッドの存在は意図的なものと見うけられますが、混乱を招くことには変わりありません。もしもAPIの固定化によってメソッド名が変更できないのであれば別ですが、そうでないのであれば、どちらかを削除すべきです。

]]>
Method doesn't override method in superclass due to wrong package for parameter {1} doesn't override method in superclass because parameter type {4} doesn't match superclass parameter type {5}
The method in the subclass doesn't override a similar method in a superclass because the type of a parameter doesn't exactly match the type of the corresponding parameter in the superclass. For example, if you have:

import alpha.Foo;
public class A {
  public int f(Foo x) { return 17; }
}
----
import beta.Foo;
public class B extends A {
  public int f(Foo x) { return 42; }
}

The f(Foo) method defined in class B doesn't override the f(Foo) method defined in class A, because the argument types are Foo's from different packages.

]]>
Method doesn't override method in superclass due to wrong package for parameter {1} doesn't override method in superclass because parameter type {4} doesn't match superclass parameter type {5}
The method in the subclass doesn't override a similar method in a superclass because the type of a parameter doesn't exactly match the type of the corresponding parameter in the superclass. For example, if you have:

import alpha.Foo;
public class A {
  public int f(Foo x) { return 17; }
}
----
import beta.Foo;
public class B extends A {
  public int f(Foo x) { return 42; }
  public int f(alpha.Foo x) { return 27; }
}

The f(Foo) method defined in class B doesn't override the f(Foo) method defined in class A, because the argument types are Foo's from different packages.

In this case, the subclass does define a method with a signature identical to the method in the superclass, so this is presumably understood. However, such methods are exceptionally confusing. You should strongly consider removing or deprecating the method with the similar but not identical signature.

]]>
メソッド名がまぎらわしいです。 {1} と {3} のメソッドは、混乱しがちです。
これらのメソッド名は、大文字小文字が違うだけです。

]]>
明らかなメソッドとコンストラクタの間違え。 {1} は恐らくコンストラクタにしたかったのでしょう。
このメソッドは自分が宣言されたクラス名と同じ名前を与えられています。これはコンストラクタとしたかったのだと思われます。そうであれば、void戻り値の宣言を取り除いてください。もしも間違ってメソッドとして宣言してしまい、後から間違いに気付いて、正しいコンストラクタを宣言し、後方互換性のため、メソッドもそのまま残したのであれば、メソッドの方をdeprecate宣言してください。

]]>
クラスで hashcode() を宣言しています。これは hashCode() であるべきではありませんか? クラス {0} で hashcode() を宣言しています。しかしこれは、 hashCode() であるべきではありませんか?
このクラスにはhashcode()というメソッドが定義されています。このメソッドは、java.lang.ObjecthashCode()を(そのように意図したのかもしれませんが)オーバーライドしません。

]]>
クラスで tostring() を宣言しています。これは toString() であるべきではありませんか? クラス {0} で tostring() を宣言しています。これは toString() であるべきではありませんか?
このクラスはtostring()を定義しています。このメソッドは、java.lang.ObjecttoString()を(そのように意図したのかもしれませんが)オーバーライドしません。

]]>
クラスは、equal()を定義していますが、equals()の間違いではないですか? クラス {0} は equal() を定義していますが、equals()の間違いではないですか?
このクラスはequal(Object)を定義しています。このメソッドは、java.lang.Objectequals(Object)を(そのように意図したのかもしれませんが)オーバーライドしません。

]]>
例外クラスのような名前を持った、非例外クラス。 クラス {0} はExceptionの継承クラスではないのに、例外クラスのごとく命名されています。
このクラスはExceptionクラス継承していないのに、クラス名が"Exception"で終了しています。これは利用者を混乱へと導きます。

]]>
メソッドは InputStream.read() の戻り値を無視しています。 {1} は {2} の戻り値を無視しています。
このメソッドは、java.io.InputStream.read()の戻り値を無視しています。戻り値を無視すると、実際に何バイトのデータが読み込まれたのか分かりません。一般には、指定された長さ分完全に読み込んでしまうケースが多いために、顕在化せず、ごくたまに発生するやっかいなバグとなります。

]]>
このメソッドで、InputStream.skip()の戻り値を無視しています。 {1} は、 {2} の戻り値を無視しています。
このメソッドは、データの読み込みをスキップするメソッドjava.io.InputStream.skip() の戻り値を無視しています。 戻り値をチェックしないと、実際には呼び出し元が要求したバイト数よりも少ないバイト数しかスキップしなかった場合に、何バイトスキップしたのか分らなくなります。 これは潜在的なバグとなります。なぜなら、大抵の場合、要求通りのスキップが行なわれるので、まれにしか現象が起きないからです。 これに対し、バッファストリームの場合、skip()はバッファ内部のデータをスキップするだけなので、頻繁に現象が起きることになります。

]]>
The readResolve method must not be declared as a static method. {1} should be declared as an instance method rather than a static method
In order for the readResolve method to be recognized by the serialization mechanism, it must not be declared as a static method.

]]>
private readResolve method not inherited by subclasses private readResolve method in {0} not inherited by subclasses.
This class defines a private readResolve method. Since it is private, it won't be inherited by subclasses. This might be intentional and OK, but should be reviewed to ensure it is what is intended.

]]>
readResolveメソッドの戻り値の型は、Objectでなければなりません。 {1} の戻り値が{1.returnType}になっていますが、Objectにしなければなりません。
直列化機構から正しく認識されるためには、readResolveメソッドの戻り値の型はObjectでなければなりません。

]]>
transientフィールドを持つクラスが直列化可能になっていません。 {1.givenClass} はtransientと宣言されていますが、{0}は直列化可能ではありません。
transientフィールドを持つクラスが直列化可能になっていません。このためtransientと宣言しても何の効果もありません。これは、直列化可能クラスを修正する段階で間違えたか、直列化機構に対して誤解していることが原因と思われます。

]]>
直列化復元の際に設定されないtransientフィールドがあります。 {1}フィールドは、transientですが、直列化復元の際に値が設定されません。
このクラスには、クラス内の様々な場所で更新されるフィールドを持っており、このフィールドは、このクラスの状態の一部と考えられます。しかしこのフィールドはtransientと宣言されているのに、readObject/readResolveメソッドで値が設定されません。このためこのクラスの全てのインスタンスで、このフィールドはデフォルト値を開始値として持つことになります。

]]>
直列化のためには、メソッドをprivate宣言しなければなりません。 メソッド {1.givenClass} はprivate宣言しなければ、{0}の直列化、直列化復元で呼び出されません。
このクラスは Serializable インターフェースを実装しており、直列化、直列化復元を行うためのメソッドを宣言しています。しかしメソッドがprivate宣言されていないので単に無視されます。

]]>
クラスはExternalizableを実装していますが、引数無しコンストラクタを定義していません。 {0} はExternalizableを実装していますが、アクセス可能な引数無しコンストラクタを定義していません。
このクラスはExternalizableインターフェースを実装していますが、引数無しのコンストラクタを定義していません。Externalizableオブジェクト直列化復元される際、まず引数無しコンストラクタを呼んでインスタンスを生成する必要があります。このクラスには、これが無いので、実行時に直列化、直列化復元処理に失敗します。

]]>
このクラスはSerializableを実装していますが、親クラスが引数無しコンストラクタを定義していません。 {0} はSerializableを実装していますが、親クラスは、アクセス可能な引数無しコンストラクタを定義していません。
このクラスは Serializable インターフェースを実装していますが、親クラスは実装していません。このクラスのオブジェクトを直列化復元する場合、親クラスのフィールドの初期化は、親クラスの引数無しコンストラクタで行う必要があります。ところが、親クラスが引数無しコンストラクタを持たないので、直列化、直列化復元処理は実行時に失敗します。

]]>
クラスは直列化可能です。しかし serialVersionUID を宣言していません。 {0} は直列化可能です。serialVersionUID を宣言することを考慮してください。
このクラスは Serializable を実装しています。しかし、serialVersionUID フィールドを定義していません。クラス参照を追加する程度の簡単な変更でも、合成フィールドを追加することになり、これは、暗黙的に生成されるserialVersionUIDの値を変えてしまいます(例えば、String.classへの参照を追加すると、class$java$lang$Stringというスタティックフィールドが生成されます)。また、複数のJavaコンパイラの間では、このクラス参照、インナークラス参照に対して生成される、合成フィールドの命名規則が異なる場合があります。異なるバージョン間での相互運用性を保証するため、serialVersionUIDを明示的に定義する事を検討してください。

]]>
Serializableを実装していないComparator。 {0} はComparatorを実装していますが、Serializableを実装していません。
このクラスは Comparator インターフェースを実装しています。Serializableも実装すべきかどうか検討すべきです。もしもTreeMapのような順序付きコレクションでこのコンパレータを使用すると、コンパレータが直列化可能である場合にのみ、TreeMapは直列化されます。大抵のコンパレータは全く状態を持っていないか、持っていたとしてもわずかなので、直列化可能とするのは簡単であり、良い防御的プログラミングであると言えます。

]]>
breakしないcaseが、switch文の中にあります。 {1}で使用されているswitch文のcaseの中にbreakしていないものがあります。
このメソッド内のswitch文の中には、breakしていないcaseがあります。この場合、制御は次のcaseにフォールスルーします。大抵の場合caseはbreakかreturnで終了する必要があります。

]]>
switchのフォールスルーによって、代入が無駄になっています。 直前のcaseにおける値 {2} は、switchのフォールスルーによって単に上書きされます。
直前のcaseで値が格納されていますが、switchのフォールスルーによって、単に上書きされます。恐らくbreak、returnを直前のcaseに入れ忘れたものと思われます。

]]>
クラスの writeObject() メソッドは同期化されています。しかし それ以外のメソッドは同期化されていません。 {0} の writeObject メソッドは同期化されています。しかし、それ以外のメソッドは同期化されていません。
このクラスの writeObject() メソッドは同期化されていますが、他のメソッドは同期化されていません。

]]>
クラスの readObject() メソッドは同期化されています。 {0} の readObject() メソッドは同期化されています。
この直列化可能クラスは同期化された readObject() を定義していますが、そもそもオブジェクトが直列化復元される場合、ただ1つのスレッドによって行われる事になっています。このため、readObject() を同期化する必要はありません。もしも readObject() メソッド自体が、他のオブジェクトへの他のスレッドからのアクセスを引き起こしているなら、それは非常に疑わしいコーディングです。

]]>
serialVersionUID が static ではありません。 {1} が static ではありません。
このクラスは serialVersionUID フィールドを定義していますが、staticではありません。直列化のバージョンUIDのために作成したのであれば、このフィールドは、staticとすべきです。

]]>
serialVersionUID が final ではありません。 {1} が final ではありません。
このクラスは serialVersionUID フィールドを定義しますが、finalではありません。直列化のバージョンUIDのために作成したのであれば、このフィールドは、finalとすべきです。

]]>
serialVersionUID が long ではありません。 {1} が long ではありません。
このクラスは serialVersionUID フィールドを定義していますがlongではありません。直列化のバージョンUIDのために作成したのであれば、このフィールドは、longとすべきです。

]]>
直列化可能なクラスのインスタンスフィールドが、非transientで、非直列化可能です。 クラス {0} が 非transientで非直列化可能なインスタンスフィールド {1.name} を宣言しています。
この直列化可能クラスは、transientでもなく、直列化可能でもなく、java.lang.Objectでもないインスタンスフィールドを持っています。また、Externalizable インターフェースも実装していませんし、readObject()writeObject() メソッドも定義していません。このフィールドに実際に非直列化可能クラスのインスタンスを保持している場合、このクラスのオブジェクトは、直列化復元を正しく行えません。

]]>
直列化可能でないクラスが、直列化可能なインナークラスを持っています。 {0} は直列化可能ですが、直列化可能でないクラスのインナークラスとなっています。
この直列化可能クラスは、直列化可能でないクラスのインナークラスとなっています。これを直列化すると、一緒にouterクラスのインスタンスも直列化しようとして、実行時にエラーとなるでしょう。

可能であれば、インナークラスをstaticとしてください。outerクラスを直列化可能とすることでも問題を解決できますが、この場合インナークラスの直列化にあたってouterクラスも直列化されることに注意してください。おそらくこれはプログラマの意図とは異なるでしょう。 ]]>

直列化可能なインナークラス {0} は直列化可能なインナークラスです。
この直列化可能なクラスはインナークラスです。このクラスのインスタンスを直列化しようとすると、関連するouterクラスのインスタンスも一緒に直列化されます。outerクラスが直列化可能なので、問題はありませんが、予想外に大量のデータが直列化される可能性があります。可能であれば、インナークラスをstaticとしてください。 ]]>
直列化出来ない値が、直列化可能と宣言されたクラスのインスタンスフィールドに格納されています。 {2} が、{1.givenClass} のtransientでないフィールドに格納されています。
直列化出来ない値が、直列化可能と宣言されたクラスのtransientでないフィールドに格納されています。

]]>
コンストラクタが Thread.start() を実行しています。 {1} が {2} を実行しています。
コンストラクタがスレッドを開始しています。継承が可能なクラスでは、この設計は間違いと思われます。なぜなら、サブクラスのコンストラクタが実行される前に、スレッドが開始してしまうためです。

]]>
読まれないフィールドがあります。このフィールドは static になるべきではないのですか? 読まれないフィールド {1} があります。このフィールドは static になるべきではないのですか?
このクラスは、staticでないfinalフィールドがあり、コンパイル時に決定される、静的な値に初期化されています。このフィールドをstaticとすることを検討してください。

]]>
利用されないフィールドがあります。 利用されないフィールド {1} があります。
このフィールドは利用されません。クラスから削除する事を検討してください。

]]>
読まれないフィールドがあります。 読まれないフィールド {1} があります。
このフィールドが読み出される事はありません。クラスから削除する事を検討してください。

]]>
forループにおける複雑で難解なインクリメント。 {1}のforループに複雑で難解な間違ったインクリメントが存在します。
このforループでのインクリメントは正しい変数に対して行なわれていますか? 別の変数が初期化され、チェックされているようです。

]]>
このフィールドはnullに設定されるだけです。 このフィールドはnullに設定されるだけです: {1}。
このフィールドへの全ての書き込みは定数のnullであり、このフィールドからの読み出しは全てnullになります。間違いが無いかチェックしてください、不要であるなら削除してください。

]]>
書かれないフィールドがあります。 書かれないフィールド {1} があります。
このフィールドに書かれる事はありません。このため読み出されるのはデフォルト値です。初期化が必要ではないですか? もしも不要なら、削除する事を検討してください。

]]>
非スタティックメソッドからのスタティックフィールドへの書き込み。 非スタティックメソッド{1}でスタティックフィールド{2}に書き込んでいます。
この非スタティックメソッドはスタティックフィールドに書き込みを行なっています。これは複数のインスタンスが同時に操作された時に正しく動作させるのが困難で、良くないやり方です。

]]>
nullと分かっている値のロード。 {1}でnullと分かっている値をロードしています。
参照されている変数は、すでにnullであるかチェックが行なわれており、この地点ではnullであることが分かっています。これ自体は合法ですが、間違いを示唆しています(恐らく違う変数を参照したかったか、前のチェックはnullチェックではなく非nullチェックを意図していたのではないかと思われます)。

]]>
readLine()の結果に対する即座の参照外し。 {1}でreadLine()の結果を即座に参照外ししています。
readLine()の結果を即座に参照外ししています。readLine()は読み込むべきデータが無くなるとnullを返すので、NullPointerExceptionのスローを招きます。

]]>
書き込まれていないフィールドの読み出し。 {1}で書き込まれていないフィールド{2.name}を読み出しています。
このプログラムの中で、まだ書き込まれていないと考えられるフィールドの参照外しを行なっています。これはNullPointerExceptionのスローを招きます。

]]>
staticな内部クラスになるべきではないのですか? {0} は staticな内部クラスになるべきではないのですか?
このクラスは非static内部クラスですが、インスタンス生成時に保持される、生成元のインスタンスへの参照を使用していません。この参照はインスタンスの大きさを増大させ、不必要に生成元への参照を長時間保持することにつながります。可能であれば、static内部クラスとすべきです。

]]>
コンストラクタで初期化されていないフィールドの読み出し。 コンストラクタで初期化されたいないフィールドが{1}で読み出されています。
コンストラクタで初期化されていないため、オブジェクトが初期化された後nullとなっていると思われるフィールドを読み出しています。コーディングミスかもしれません。あるいはフィールドへの書き込みがメソッド呼び出しの順序に依存しているのかもしれません(必ずしも間違いではありませんが危なっかしいやり方です)。

]]>
フィールドがコンストラクタで初期化されていません。 {1.givenClass}がコンストラクタで初期化されていません。
このフィールドはコンストラクタで初期化されていません。このためオブジェクトが生成された後nullとなっていると思われます。フィールドが初期化される前に参照外しされればNullPointerExcepitionのスローを招くため、これは間違いか、設計不備との可能性があります。

]]>
名前付きstatic内部クラスにリファクタリング可能と思われます。 クラス {0} は、名前を持ったstatic内部クラスにリファクタリング可能です。
このクラスは非static内部クラスですが、インスタンス生成時に保持される、生成元のインスタンスへの参照を使用していません。 この参照はインスタンスの大きさを増大させ、不必要に生成元への参照を長時間保持することにつながります。可能であれば、static内部クラスとすべきです。匿名内部クラスはstaticと出来ないため、これを実現するには、名前を持ったstatic内部クラスに変更するよう、リファクタリングする必要があります。

]]>
static内部クラスにリファクタリング可能です。 クラス {0} は、static内部クラスにリファクタリング可能です。
このクラスは非static内部クラスですが、インスタンス生成時に保持される、生成元のインスタンスへの参照を使用していません。 この参照はインスタンスの大きさを増大させ、不必要に生成元への参照を長時間保持することにつながります。可能であれば、static内部クラスとすべきです。非static内部クラスの生成時には、エンクロージングクラスのインスタンスが必要となります。このため、内部クラスのコンストラクタに、エンクロージングクラスのインスタンスを渡すようにリファクタリングする必要があるかもしれません。

]]>
waitがループの中にありません。 {1} の中でwaitがループの中にありません。
このメソッドはjava.lang.Object.wait()を呼び出していますが、ループの中にありません。幾つかの条件を待ち合わせるためにモニタを利用する場合は、wait()を抜けたからといって、自分が待っている条件が成立している保証はありません。

]]>
Condition.await()がループに囲まれていません。 {1}でのCondition.await()呼び出しがループに囲まれていません。
このメソッドはjava.util.concurrent.locks.Condition.await()(あるいはその変形版) を呼び出していますが、ループの中にありません。オブジェクトが複数の条件の待ち合せに使用されると、起こされた時に、それが自分の待ち合わせ条件に合致するとは限りません。

]]>
notifyAll() ではなく notify() を使っています。 {1} において、notifyAll ではなく notify を使っています。
このメソッドはnotifyAll()ではなくnotify()を呼び出しています。Javaのモニタは、しばしば幾つかの条件を同時に待ち合わせるために使用されますが、notify()を使って待機スレッドを起こすと、別の条件を待っているスレッドを起こすだけになるかもしれません。

]]>
String.indexOfの結果の正かどうかのチェック。 {1} はString.indexOfの結果が正かどうかチェックしています。
このメソッドはString.indexOfを呼び出して結果が正か正でないかを調べています。普通は結果が負か負でないかでチェックするはずです。正であることでチェックしているため、部分文字列が先頭に見つかったケースを見逃がしてしまします。

]]>
readLine()の結果がnullで無いことをチェックした後の破棄。 {1} はreadLine()の結果がnullで無いことをチェックした後に破棄しています。
readLine()の結果がnullでないことをチェックした後に単に破棄されています。ほとんどの場合nullで無いことをチェックした後には、その値を使用するはずです。もう一度readLine()を呼び出すと次の行が返るので、元の行の内容は取り出せません。 ]]>
メソッドにおいて戻り値を無視しています。 {1} は {2} の戻り値を無視しています。
このメソッドの戻り値をチェックするべきです。このようなコードを書いてしまった原因の1つとして、イミュータブルなオブジェクトのメソッド呼び出しが、そのオブジェクトの状態を変化させると誤解しているケースが考えられます。例えば、

String dateString = getHeaderField(name);
dateString.trim();

このメソッドの戻り値をチェックするべきです。このようなコードを書いてしまった原因の1つとして、イミュータブルなオブジェクトのメソッド呼び出しが、そのオブジェクトの状態を変化させると誤解しているケースが考えられます。例えば、

String dateString = getHeaderField(name);
dateString = dateString.trim();
]]>
Method ignores exceptional return value {1} ignores exceptional return value of {2}
This method returns a value that is not checked. The return value should be checked since it can indicate an unusual or unexpected function execution. For example, the File.delete() method returns false if the file could not be successfully deleted (rather than throwing an Exception). If you don't check the result, you won't notice if the method invocation signals unexpected behavior by returning an atypical return value.

]]>
Exception created and dropped rather than thrown {1} forgets to throw {2.givenClass}
This code creates an exception (or error) object, but doesn't do anything with it. For example, something like

if (x < 0)
  new IllegalArgumentException("x must be nonnegative");

It was probably the intent of the programmer to throw the created exception:

if (x < 0)
  throw new IllegalArgumentException("x must be nonnegative");
]]>
戻り値を無視しているメソッド呼び出し。 {1} で {2} の戻り値を無視しています。
このメソッドの戻り値を無視すべきではありません。この警告が出力される原因として、イミュータブルなオブジェクトのメソッドを呼び出して、それによりオブジェクトの状態が変更できると考えているケースが挙げられます。例えば以下のようなコードです。

String dateString = getHeaderField(name);
dateString.trim();

このプログラマは、trim()メソッドがdateStringが参照しているStringの状態を変えると考えているように思われます。しかしStringはイミュータブルであり、trim()メソッドは新しいStringオブジェクトを返すので、これでは戻されたオブジェクトが捨てられてしまいます。このコードは、以下のように修正すべきです。

String dateString = getHeaderField(name);
dateString = dateString.trim();
]]>
nullポインタを参照外しをしています。 {1} の中でnullポインタ{2.givenClass}を参照外しをしています。
nullに設定された参照を通してアクセスが行われています。コードが実行されればNullPointerExceptionが発生するでしょう。

]]>
NonNullアノテーションのついたフィールドにnullを格納しています。 フィールド {2.givenClass} は NonNullアノテーションが付けられていますが、{1} でnullが格納されています。
NonNullアノテーションが付けられたフィールドに、nullになるかもしれない値が代入されています。

]]>
メソッドの例外経路において、nullポインタの参照外しをしています。 {1} の例外経路において{2.givenClass}のnullポインタの参照外しをしています。
nullに設定された参照を通したアクセスが、例外処理の経路で行われています。コードがじっこうされれば、NullPointerExceptionが発生するでしょう。現在のFindBugsは、実行され得ない例外処理経路を考慮しません。このため、この警告は誤って報告されるかもしれません。

また、FindBugsはswitch-caseのdefaultも例外経路と見なしますが、しばしばdefaultは実行され得ない場合がありますので、注意してください。

]]>
nullポインタの参照外しをしている可能性があります。 {1} の中で{2.givenClass}をnullポインタの参照外しをしている可能性があります。
この参照変数を通したアクセスは、実行時に参照変数がnullとなる可能性があります。これは、実行時にNullPointerExceptionを発生させる可能性があります。

]]>
Possible null pointer dereference on path that might be infeasible Possible null pointer dereference of {2.givenClass} on path that might be infeasible in {1}
There is a branch of statement that, if executed, guarantees that a null value will be dereferenced, which would generate a NullPointerException when the code is executed. Of course, the problem might be that the branch or statement is infeasible and that the null pointer exception can't ever be executed; deciding that is beyond the ability of FindBugs. Due to the fact that this value had been previously tested for nullness, this is a definite possiblity.

]]>
例外経路においてnullポインタの参照外しをしている可能性があります。 {1} の例外経路において{2.givenClass}のnullポインタの参照外しをしている可能性があります。
幾つかの例外制御経路の中で、nullとなる参照を通してアクセスが行われます。これは、実行時にNullPointerExceptionを発生させる可能性があります。現在のFindBugsは、実行され得ない例外処理系を考慮しません。このため、この警告は誤って報告されるかもしれません。

また、FindBugsはswitch-caseのdefaultも例外経路と見なしますが、しばしばdefaultは実行され得ない場合がありますので、注意してください。

]]>
メソッドの戻り値が原因でnullとなっている可能性のある参照の参照外し。 メソッドの戻り値が原因でnullとなっている可能性のある参照が{1}で参照外しされています。
幾つかの例外パスの中でnullとなる参照が、ここで参照外しされています。これは実行時にNullPointerExceptionを招きます。この値はnullを返す可能性のあるメソッドの戻り値を使用しているため、nullとなるかもしれません。

]]>
無条件に引数の参照外しを行なう仮想メソッドにnullを渡しています。 無条件に引数の参照外しを行う仮想メソッド {2.givenClass} に {1} でnullを渡しています。
引数を無条件に参照外しするメソッドにnullとなり得る値を渡しています。これはNullPointerExceptionの発生を招きます。

]]>
無条件に引数の参照外しを行うメソッドにnullを渡しています。 無条件に引数の参照外しを行なうメソッド {2.givenClass} に {1} でnullを渡しています。
引数を無条件に参照外しするメソッドにnullとなり得る値を渡しています。これはNullPointerExceptionの発生を招くと見受けられます。

]]>
メソッド内で無条件に参照外しされる引数へのnullの引き渡し。 {1} におけるメソッド呼び出しでnullを渡していますが、{2.givenClass}のパラメータは無条件に参照外しされます。
メソッドにnullを渡していますが、このメソッドの中で無条件に参照外しされるようです。

]]>
メソッド呼び出しで非null引数にnullを渡しています。 {1} でnullをメソッドに渡していますが、この引数は {2.givenClass} で非null引数です。
このメソッドではnullをメソッドに渡しています。しかし、この引数は@NonNullと宣言されているか、解析の結果から常に参照外しされると判定されたため、nullが許されません。

]]>
このメソッドはnullを返すかもしれないのに@NonNull宣言されています。 メソッド {1} はnullを返すかもしれないのに@NonNull宣言されています。
nullを返すかもしれないのに、このメソッド(あるいは、親クラスの該当メソッド)は@NonNull宣言されています。

]]>
clone()がnullを返す可能性があります。 {1} はnullを返す可能性があります。
このclone()メソッドは、条件によってはnullを返す場合があるようです。しかしclone()はnullを返してはいけません。もしもこの経路が起こり得ないと確信できるのであれば、AssertionErrorをスローすることを検討してください。

]]>
toStringメソッドがnullを返す可能性があります。 {1} はnullを返す可能性があります。
このtoStringメソッドは、ある条件下で、nullを返すようです。仕様を寛大に評価すれば、これは仕様を満たしていると言えますが、おそらくはこのやり方は間違いで、他のコードが正しく動作しなくなるでしょう。nullの替わりに空文字列かその他の適切な文字列を返すようにしてください。

]]>
Nullの参照外し。 {2.givenClass} はnullとなり、{1}で必ず参照外しされます。
この文または分岐が実行されると、この値は必ずnullとなります。そしてこの値はその後必ず参照外しされます(RuntimeExceptionのスローを含むフォワードパスを通る場合を除きます)。

]]>
この値はnullであり、例外経路で必ず参照外しされます。 {2.name} はnullであり、例外経路において {1} で必ず参照外しされます。
例外経路で、この文または分岐が実行されると、この値は必ずnullとなります。そしてこの値は必ず参照外しされます(RuntimeExceptionのスローを含むフォワードパスを通る場合を除きます)。

]]>
全てのstatic finalフィールドが割り当てられる前に、static初期化子がインスタンス生成をおこなっています。 {0} のstatic初期化子が全てのstatic fieldが割り当てられる前にインスタンス生成をおこなっています。
クラスのstatic初期化子が、全てのstatic finalフィールドの値が代入される前に、インスタンス生成を行っています。

]]>
メソッドでストリームのクローズに失敗する可能性があります。 {1} でストリームのクローズに失敗する可能性があります。
このメソッドは入出力ストリームを生成していますが、そのインスタンスはフィールドに保持されず、close()が実行されるかもしれない別のメソッドに引き渡してもおらず、あるいはそのまま戻り値として返送されてもいません。そして、このメソッドを起点とする実行経路上には、ストリームのクローズ処理が行われない経路があります。これは入出力ディスクリプタのリークにつながる恐れがあります。一般にはfinallyブロックを使ってリソースをクローズするのが良いやり方です。

]]>
例外発生時にストリームのクローズに失敗するかもしれません。 {1} で例外の発生時にストリームのクローズに失敗するかもしれません。
このメソッドで入出力ストリームオブジェクトが生成されていますが、フィールドへの格納も他のメソッドへの引き渡しも、戻り値としての返送も行なわれていません。そして、このメソッドを起点とする例外パスの中にクローズが行なわれないパスがあります。これはファイルディスクリプタのリークを招きます。確実にクローズが行なわれるようfinallyブロックを使用するのが良い考えです。 ]]>
戻り値としてnullよりむしろ長さ0の配列を返すことを検討すべきです。 {1} では戻り値としてnullよりもむしろ長さ0の配列を返すことを検討すべきではありませんか?
結果が空を表すためには、多くの場合、nullを返すよりもサイズ0の配列を返す方が良い設計です。これにより、利用者側のコードでnullとの明示的な比較を行わなくても済むようになります。

これに対し「返すべき値が無い事を示す」のにnullを用いるのが、恐らく適切です。例えば、File.listFiles()は、ディレクトリにファイルが無い時はサイズ0の配列を、指定されたパスがディレクトリでなければnullを返します。

]]>
利用されないフロー制御ステートメントがあります。 {1} に、利用されないフロー制御ステートメントあります。
このメソッドには、無駄なフロー制御ステートメントがあります。分岐を通ったかどうかにかかわらず、制御の流れは変わりません。例えば以下のような空のifブロックを記述してしまった事が原因です。

    if (argv.length == 1) {
        // TODO: handle this case
    }
]]>
次の行へ移るだけの不要な制御フロー。 {1} は次の行に移るだけなので、無駄です。
このメソッド内には、制御フローを全く変えないか、単に次の行に移るだけの分岐が存在します。これは、不注意で以下のような空のif文を作成してしまった場合に起き得ます。

     if (argv.length == 1);
         System.out.println("Hello, " + argv[0]);
 
]]>
すでに参照外しされているのにnullチェックしています。 {1} ですでに参照外しされているのに {2.givenClass} でnullチェックされています(行{4.lineNumber})。
参照がここでnullチェックされていますが、この参照がnullになることはあり得ません。なぜなら前に参照外しされているからで、もしもnullなら前の段階でNullPointerExceptionが発生しているはずです。そもそもここのコードと前の参照外ししているコードとは参照がnullであるかどうかという点で矛盾しているのです。チェック自体が余計か、前の参照外しが間違っています。

]]>
nullであることが明らかな参照の無駄なnullチェック。 nullであることが明らかな参照{2}を無駄にnullチェックしています {1}。
このメソッドはnullであることが分かっている参照を無駄にnullチェックしています。

]]>
nullでないことが明らかな参照の無駄なnullチェック。 nullでないことが明らかな参照{2}を無駄にnullチェックしています{1}。
このメソッドはnullでないことが分かっている参照を無駄にnullチェックしています。

]]>
2つのnull参照を無駄に比較しています。 {1}で2つのnull参照を無駄に比較しています。
このメソッドでnullであることが明らかな2つの参照を無駄に比較しています。

]]>
非null参照を無駄にnullと比較しています。 {1} で非null参照を無駄にnullと比較しています。
このメソッドで非nullと分かっている参照をnullと分かっている参照と比較しています。

]]>
既にチェック済みの値を無駄にnullと比較しています。 {1}で既にチェック済みの値{2}を無駄にnullと比較しています。
このメソッドは、無駄な参照変数とnullとの比較を行っています。以下の2つのタイプの無駄な比較が報告されます。
  • 比較されている2つの値は明らかにnullです。
  • 一方は明らかにnullであり、もう一方は明らかにnullではありません。

この警告は、一般には、明らかにnullでない値をnullとチェックすることにより報告されます。単純に、実際には、チェックは全く不要な、防御的プログラミングかもしれません。

]]>
メソッドで全ての経路においてロックが解放されません。 {1} で、全ての経路においてロックが解放されません。
このメソッドは、JSR-166 (java.util.concurrent) ロックを獲得していますが、このメソッドを起点とした実行経路に解放されない経路があります。一般には、このロックを使うための、正しいイディオムは次のようになります。
    Lock l = ...;
    l.lock();
    try {
        // do something
    } finally {
        l.unlock();
    }

]]>
メソッドで全ての例外経路においてロックが解放されません。 {1} で、全ての例外経路においてロックが解放されません。
このメソッドは、JSR-166 (java.util.concurrent) ロックを獲得していますが、このメソッドを起点とした例外処理経路に、解放されない経路があります。一般には、このロックを使うための、正しいイディオムは次のようになります。
    Lock l = ...;
    l.lock();
    try {
        // do something
    } finally {
        l.unlock();
    }

]]>
疑わしい参照の比較です。 {1} で参照されている {2} の比較は疑わしいです。
このメソッドでは、2つの参照が == あるいは != 演算子で比較されていますが、一般には、equals()メソッドを使う方が正しいやり方です。例えばjava.lang.Integerやjava.lang.Floatは、このようなクラスの例で、参照の比較を使うべきではありません。

]]>
Using pointer equality to compare different types Using pointer equality to compare a {2} with a {3} in {1}
This method uses using pointer equality to compare two references that seem to be of different types. The result of this comparison will always be false at runtime.

]]>
違う型のオブジェクトを比較するのにequals()を使用しています。 {1}の中で違う型のオブジェクトを比較するのにequals()を使用しています。
このメソッドは、違う型のオブジェクト参照をequals(Object)で比較しています。正しいequals()の実装では、違う型のオブジェクトをequals()で比較すると、常にfalseが返ります。このため、実行時にはこの比較は常にfalseになるものと思われます。

]]>
違う型のオブジェクトをequals()で比較しています。 {1}の中で、違う型のオブジェクトをequals()で比較しています。
このメソッドで equals(Object) が無関係のインターフェース(サブタイプでもない)の2つの インスタンス間で使用されています。equals()の契約では、こういったケースは、常にfalseが返ります。 もちろん、両方のインターフェースを実装したクラスを作成することも可能ですが、もう一度 プログラムを良く調べた方がいいでしょう。

]]>
関係の無いクラスとインターフェースをequals()で比較しています。 関係の無いクラスとインターフェースを {1} でequals()で比較しています。
このメソッドで2つの参照をequals(Object)で比較しています。片方はクラス、もう片方はインターフェースですが、このクラスと抽象クラスでないサブクラスのいずれもこのインターフェースを実装していません。このため(もしも調査外となってしまったアプリケーションクラスが存在する、あるいは実行時に動的なクラスロードが行なわれるというケースを除けば)、2つの比較されているオブジェクトは同じクラスのインスタンスではありません。equals()契約によれば、異なるクラスのオブジェクトは常に等しくありません。このためjava.lang.Object.equals(Object)の契約によって、この比較は実行時には常にnullになるでしょう。

]]>
equals()の引数にnullを渡しています。 {1}の中で、equals()の引数に nullを渡しています。
このメソッドは、equals(Object)にnullを渡しています。正しいequals()の実装では、これは常にfalseを返します。

]]>
組合せが間違った wait() があります。 {1} で、wait()の組合せが間違っています。
このメソッドは、ロックを獲得せずにObject.wait()を呼び出しています。ロックを獲得せずにwait()を呼び出すと、IllegalMonitorStateExceptionが発生します。

]]>
組合せが間違った notify() があります。 {1} で、組合せが間違った notify() があります。
このメソッドは、ロックを獲得せずにObject.notify()あるいはObject.notifyAll()を呼び出しています。ロックを獲得せずにnotify()やnotifyAll()を呼び出すと、IllegalMonitorStateExceptionが発生します。

]]>
ローカル変数の自己代入があります。 {1} で、ローカル変数の自己代入があります。
このメソッドは、ローカル変数の自己代入があります。例えば、
  public void foo() {
    int x = 3;
    x = x;
  }
この例のような代入は、無駄です。ロジックの誤りや、タイプミスかもしれません。

]]>
フィールドの自己代入があります。 {1} で、{2.givenClass} の自己代入をおこなっています。
このメソッドは、フィールドの自己代入があります。例えば、
  int x;
  public void foo() {
    x = x;
  }
この例のような代入は、無駄です。ロジックの誤りや、タイプミスかもしれません。

]]>
フィールドへの二重代入。 {1}でフィールド {2.givenClass} への二重代入が行われています。
このメソッドでフィールドへの二重代入が行われています。

  int x,y;
  public void foo() {
    x = x = 17;
  }

フィールドに2回代入するのは無意味です。恐らく論理の誤りかタイプミスでしょう。

]]>
ローカル変数への二重代入。 {1}で、{2} への二重代入が行われています。
このメソッドでローカル変数への二重代入が行われています。

  public void foo() {
    int x,y;
    x = x = 17;
  }

変数に2回代入するのは無意味です。恐らく論理の誤りかタイプミスでしょう。

]]>
フィールドを含んだ、無意味な自己演算(例:x & x)。 {2.givenClass}と{1}自身との無意味な自己演算があります。
メソッド内でフィールドと、同じフィールド参照との間で演算を行っています(例:x&x or x-x)。この演算の特性上、意味があるとは思えず、タイプミスあるいは論理の誤りと考えられます。演算内容について、もう一度確認してください。

]]>
変数を含んだ、無意味な自己演算(例:x & x)。 {2}と{1}自身との無意味な自己演算があります。
メソッド内で変数と、同じ変数参照との間で演算を行っています(例:x&x or x-x)。この演算の特性上、意味があるとは思えず、タイプミスあるいは論理の誤りと考えられます。演算内容について、もう一度確認してください。

]]>
フィールドとそれ自身との自己比較。 {2.givenClass}をそれ自身{1}と自己比較しています。
メソッド内でフィールドをそれ自身と比較しています。これはタイプミスか論理の誤りと思われます。比較対象が正しいかどうか確認してください。

]]>
変数とそれ自身との自己比較。 {2}をそれ自身{1}と自己比較しています。
メソッド内で変数をそれ自身と比較しています。これはタイプミスか論理の誤りと思われます。比較対象が正しいかどうか確認してください。

]]>
Double.longBitsToDoubleがintに対して呼び出されています。 {1}でDouble.longBitsToDoubleがintに対して呼び出されています。
Double.longBitsToDoubleメソッドが呼び出されていますが、引数には32bit intが渡されています。これはほぼ間違いなく意図されたものではなく、期待した結果は得られないでしょう。

]]>
Randomオブジェクトが生成され、たった1回だけ使用されています。 {1}でRandomオブジェクトが生成され、たった1回だけ使用されています。
このコードはjava.util.Randomオブジェクトを生成し、1つの乱数を生成し、Randomオブジェクトを破棄しています。これは非効率であり、生成される乱数の質も良くありません。生成したRandomオブジェクトを保存して同じRandomオブジェクトから乱数を生成するようにしてください。

生成される乱数値が推測できないようにするためには、毎回Randomオブジェクトを生成してはいけません(毎回生成すると、容易に推測できてしまいます)。またjava.security.SecureRandomを替わりに使用することについても真剣に検討すべきです(この場合も毎回インスタンスを生成してはいけません)。

]]>
不適切な符号付き32-bit整数の乱数の絶対値計算。 {1}で符号付き32-bit整数の乱数の絶対値を間違って計算しています。
このコードは符号付き整数の乱数を得た後、絶対値を計算しています。もしも生成された乱数がInteger.MIN_VALUEだと、絶対値は負になります(なぜならMath.abs(Integer.MIN_VALUE) == Integer.MIN_VALUEだからです)。

]]>
不適切な符号付き32-bit整数のハッシュコードの絶対値計算。 {1}で符号付き32-bit整数のハッシュコードの絶対値を間違って計算しています。
このコードは符号付き整数のハッシュコードを得た後、絶対値を計算しています。もしもハッシュコードがInteger.MIN_VALUEだと、絶対値は負になります(なぜならMath.abs(Integer.MIN_VALUE) == Integer.MIN_VALUEだからです)。

]]>
符号付き32bit整数の乱数の剰余計算。 符号付き32bit整数の乱数の剰余が {1} で計算されています。
このコードは符号付き整数の乱数を生成し、他の値で割って剰余を求めています。乱数は負になるかもしれないので、この結果は負になるかもしれません。これが想定された動作であることを確認し、替りにRandom.nextInt(int)を使用する事を検討してください。

]]>
ハッシュコードの剰余は負になる場合があります。 {1}でハッシュコードの剰余を計算していますが、これは負になる場合があります。
このコードはハッシュコードを計算した後、剰余を計算しています。ハッシュコードは負になる場合があるため、この結果は負になるかもしれません。

計算結果が負にならないと思っているのであれば、コードを修正する必要があります。序数が2のn乗であることが明らかならば、かわりにビットANDを使用することができます(x.hashCode()%nの代わりにx.hashCode()&(n-1)を使用します)。これは恐らく剰余計算よりも高速です。それ以外のケースでは剰余に対して絶対値を算出してください(Math.abs(x.hashCode()%n)。

]]>
負にはならない値を、負の定数と比較しています。 {1}で、負にならない値を{2}と比較しています。
このコードは、負にならないことが確実な値を、負の定数と比較しています。

]]>
符号付きbyteの間違った比較。 {1}で符号付きbyteを {2} と比較しています。
byteは符号付きであり取り得る値は、-128 to 127の範囲です。byteをこの範囲外の値と比較するのは、無意味で恐らく間違いです。byte型のbを符号無しの0..255に変換したいのであれば、0xff & bとします。

]]>
無意味な整数比較。 整数値 {1} が無意味に比較されています。
この整数比較は常に同じ結果になります(例:x <= Integer.MAX_VALUE)。

]]>
整数を1で割った剰余の計算。 {1}で整数を1で割った剰余を計算しています。
任意の整数値expに対し、式 exp % 1 は常に0を返します。(exp & 1) あるいは (exp % 2) の間違いではないですか?

]]>
符号付きbyte値に対するビット論理和演算の実行。 {1} でビット論理和演算が符号付きbyte値に対して実行されています。
バイト配列から値を取り出し、ビット論理和を実行しています。バイト配列から取り出された値は32bitに符号拡張されてから、ビット演算に使用されます。このため、例えばb[0]の値が0xffであってxの値が0だとすると、((x << 8) | b[0])は、0xffが符号拡張で0xffffffffとなるので、結果は0xffffffffとなります。

とりわけ、以下のようにバイト配列に格納された値をint変数に取り出すコードはひどく間違っています。

int result = 0; for(int i = 0; i < 4; i++) result = ((result << 8) | b[i]);

かわりに以下のようなイディオムを使用することで正しく動作するようになります。

int result = 0; for(int i = 0; i < 4; i++) result = ((result << 8) | (b[i] &s; 0xff));

]]>
互換性のないビットマスク。 {1}で互換性の無いビットマスクが行われています。これは常に決った結果を返します。
このメソッドは、(a & C) と D(CとDは定数) を比較しています。しかし、このCとDの値では、比較の結果は、常に等しくないはずで、プログラミングエラーや、タイプミスの疑いがあります。

]]>
Check for sign of bitwise operation Check for sign of bitwise operation in {1}
This method compares an expression such as
((event.detail & SWT.SELECTED) > 0)
. Using bit arithmetic and then comparing with the greater than operator can lead to unexpected results (of course depending on the value of SWT.SELECTED). If SWT.SELECTED is a negative number, this is a candidate for a bug. Even when SWT.SELECTED is not negative, it seems good practice to use '!= 0' instead of '> 0'.

Boris Bokowski

]]>
Check for sign of bitwise operation Check for sign of bitwise operation in {1}
This method compares an expression such as
((event.detail & SWT.SELECTED) > 0)
. Using bit arithmetic and then comparing with the greater than operator can lead to unexpected results (of course depending on the value of SWT.SELECTED). If SWT.SELECTED is a negative number, this is a candidate for a bug. Even when SWT.SELECTED is not negative, it seems good practice to use '!= 0' instead of '> 0'.

Boris Bokowski

]]>
((...) & 0) == 0の判定。 {1}で((...) & 0) == 0の判定が行われています。
このメソッドは、(a & 0) と 0を比較しています。しかし、この結果は常に等しくなるはずで、プログラミングエラーや、タイプミスの疑いがあります。

]]>
互換性のないビットマスク。 {1}で互換性の無いビットマスクが行われています。これは常に決った結果を返します。
このメソッドは、(a | C) と D(CとDは定数)を比較しています。しかし、このCとDの値では、比較の結果は、常に等しくないはずで、プログラミングエラーや、タイプミスの疑いがあります。

このバグの典型的なパターンとして、ビットセットのテストのために、論理積("&")を使うべきところを、間違って論理和("|")を使用してしまったケースが考えられます。

]]>
インスタンスフィールドの不正な遅延初期化がおこなわれています。 {1} で {2} フィールドの不正な遅延初期化がおこなわれています。
このメソッドは、volatileでないフィールドを、同期化せずに遅延初期化しています。コンパイラやプロセッサは、命令の並べ替えを行うかもしれないので、もしもこのメソッドが複数のスレッドから同時に呼び出されるのであれば、別のスレッドがこのフィールドにアクセスした際に、中途半端に初期化されたインスタンスが見えてしまう危険があります。フィールドをvolatileにする事で、この問題を解決する事が出来ます。詳細は、Javaメモリモデルを参照してください。

]]>
staticフィールドの不正な遅延初期化がおこなわれています。 {1} で {2} staticフィールドの不正な遅延初期化がおこなわれています。
このメソッドは、volatileでないstaticフィールドを、同期化せずに遅延初期化しています。コンパイラや、プロセッサは、命令の並べ替えを行うかもしれないので、もしもメソッドが複数のスレッドから同時に呼び出されるのであれば、別のスレッドがこのフィールドにアクセスした際に、中途半端に初期化されたインスタンスが見えてしまう危険があります。フィールドをvolatileにする事で、この問題を解決する事が出来ます。詳細は、Javaメモリモデルを参照してください。

]]>
Incorrect lazy initialization and update of static field Incorrect lazy initialization and update of static field {2} in {1}
This method contains an unsynchronized lazy initialization of a static field. After the field is set, the object stored into that location is further accessed. The setting of the field is visible to other threads as soon as it is set. If the futher accesses in the method that set the field serve to initialize the object, then you have a very serious multithreading bug, unless something else prevents any other thread from accessing the stored object until it is fully initialized.

]]>
java.util.concurrent の Lock による同期がおこなわれます。 {1} 内で、java.util.concurrent の Lock による同期がおこなわれます。
このメソッドは、java.util.concurrent.locks.Lockオブジェクトで同期化を行っています。lock()unlock()を替わりに使用すべきです。

]]>
private メソッドは一度も呼ばれません。 private メソッド {1} は一度も呼ばれません。
このprivateメソッドは一度も呼ばれません。リフレクションで呼び出される可能性は残りますが、このメソッドは全く使用されておらず、削除されるべきと考えるのが自然です。

]]>
匿名クラスに呼び出せないクラスが宣言されています。 匿名クラスに宣言されたメソッド {1} は呼び出すことができません。
この匿名クラスに宣言されているメソッドは、直接呼び出されてもいなければ、継承元クラスのメソッドをオーバーライドしているわけでもありません。匿名クラスに宣言されたメソッドは、他のクラスから直接呼び出すことはできないので、結局このメソッドは呼び出すことができないように見受けられます。単に使われていないだけなのかもしれませんが、継承元のクラスのメソッドをオーバーライドしようとして失敗しているのかもしれません。もしもそうなら修正してください。

]]>
メソッドは、データベースリソースの解放に失敗するかもしれません。 {1} は、{2.excludingPackage}の解放に失敗するかもしれません。
このメソッドは、データベースリソース(例えば、コネクションや結果セット)を生成しますが、それをフィールドに代入したり、他のメソッドに渡したり、戻り値として返送したりしておらず、このメソッドを起点とする実行経路の中にクローズが行われない経路があります。データベースリソースの解放忘れは、パフォーマンスの悪化を招いたり、アプリケーションがデータベースと通信出来なくなる恐れがあります。

]]>
メソッドは、例外が起きた時にデータベースリソースの解放に失敗するかもしれません。 {1} は、例外が起きた時にデータベースリソースの解放に失敗するかもしれません。
このメソッドは、データベースリソース(例えば、コネクションや結果セット)を生成しますが、それをフィールドに代入したり、他のメソッドに渡したり、戻り値として返送したりしておらず、このメソッドを起点とする例外処理経路の中にクローズが行われない経路があります。データベースリソースの解放忘れは、パフォーマンスの悪化を招いたり、アプリケーションがデータベースと通信出来なくなる恐れがあります。

]]>
このメソッド内で、+を使ってループ内で文字列を連結しています。 メソッド {1} 内で、+を使ってループ内で文字列を連結しています。
このメソッドの中で、ループ内でStringの連結を繰り返しているようです。このためStringBuffer/StringBuilderへの変換、連結、そしてStringへの再変換という処理が何度も繰り返されます。文字列が毎回コピーし直されて長くなっていくため、繰り返し回数の二乗の処理コストが必要となる場合があります。

明示的にStringBufferあるいはStringBuilder(J2SE 1.5から導入されます)を用いる事で、パフォーマンスを改善する事が出来ます。

例)

  // 悪い例
  String s = "";
  for (int i = 0; i < field.length; ++i) {
    s = s + field[i];
  }

  // 良い例
  StringBuffer buf = new StringBuffer();
  for (int i = 0; i < field.length; ++i) {
    buf.append(field[i]);
  }
  String s = buf.toString();
]]>
このメソッドは、toArray()に長さ0の配列を渡しています。 {1} メソッドは、Collection.toArray() に流さ0の配列を引数として渡しています。
このメソッドで、Collectionの実装クラスのtoArray()メソッドに長さ0の配列を引数に渡しています。 myCollection.toArray(new Foo[myCollection.size()]) とする方が、効率の良いやり方です。もしも引数のサイズが、Collectionの中身を格納するのに十分な大きさであれば、そのまま、その配列に格納されて返送されます。さもなければリフレクションによって、新たに配列を生成しなければなりません。

]]>
runメソッドにおけるJUnitのアサーション。 {1}でJUnitのアサーションが行われています。
runメソッドの中でJUnitのアサーションが実行されています。JUnitのアサーションは失敗すると、例外をスローします。テストメソッドを実行したスレッド以外のスレッドで、この例外がスローされると、スレッドの実行が終了するだけでテストの失敗とはなりません。

]]>
TestCase は setUp を定義していますが、super.setUp()を呼び出していません。 TestCase {0} は setUp を定義していますが、super.setUp()を呼び出していません。
このクラスは、JUnitのTestCaseで、setUpを定義しています。setUpメソッドは、super.setUp()呼び出さなければならないのに、呼び出していません。

]]>
TestCase は tearDown を定義していますが、super.tearDown()を呼び出していません。 TestCase {0} は tearDown を定義していますが、super.tearDown()を呼び出していません。
このクラスはJUnitのTestCaseで、tearDownを定義しています。tearDownは、super.tearDown()を呼び出さなければなりませんが、呼び出していません。

]]>
TestCaseが非staticなsuiteメソッドを定義しています。 TestCase {0} は、非staticなsuiteメソッドを定義しています。
このクラスは、JUnitのTestCaseで、suite()メソッドを定義しています。suiteメソッドは、staticメソッドとしなければなりませんが、そうなっていません。

]]>
TestCaseが間違ったsuiteメソッドを宣言しています。 {0}にsuiteメソッドの間違った宣言があります。
このクラスはJUnitのTestCaseクラスでsuite()メソッドを定義しています。しかし、suite()メソッドは、
public static junit.framework.Test suite()
あるいは
public static junit.framework.TestSuite suite()
と宣言する必要があります。

]]>
テストを持たないTestCase。 TestCase {0} にはテストがありません。
このクラスはJUnitのTestCaseクラスですが、テストメソッドが実装されていません。

]]>
親のアダプタクラスのメソッドを不適切にオーバーライドしています。 親のアダプタクラス {0} のメソッド {1} を不適切にオーバーライドしています。
このメソッドは、親クラスのメソッドを不適切にオーバーライドしています。親クラスは、java.awt.event、javax.swing.event packageで定義されているリスナのアダプタなので、結果としてイベントが受け取れなくなります。

]]>
このメソッドは、ResultSetのインデックス0のフィールドにアクセスしようとしています。 メソッド {1} は、インデックス0のフィールドにアクセスしようとしています。
インデックスが0の状態で、ResultSetのgetXXXあるいはupdateXXXメソッドを呼び出そうとしています。ResultSetのインデックスは、1から始まるので、このコードは常に間違いです。

]]>
リザルトセットの添字0にアクセスしようとしています。 {1} メソッドはリザルトセッの添字0にアクセスしようとしています。
リザルトセットのgetXXX、updateXXXメソッド呼び出しで添字に0を指定しています。リザルトセットの添字は1から開始するので、これは常に間違いです。

]]>
PreparedStatementのパラメータに添字0を指定しています。 {1} メソッドで、PreparedStatementのパラメータを指定するのに添字0を指定しています。
PreparedStatementのsetXXXメソッドで、添字に0を指定しています。この添字は1から開始するので、これは常に間違いです。

]]>
instanceof演算子で型チェックをする必要はありません。 メソッド {1} はinstanceofを使って不要な型チェックを行なっています。これは静的に行うことが可能です。
静的に型チェックが可能なのにinstanceof演算子を使用して型チェックを行なっています。

]]>
未初期化状態のAppletStubに依存した間違ったアプレットコンストラクタ。 未初期化状態のAppletStubに依存した間違ったアプレットコンストラクタ。
このコンストラクタは親アプレットのメソッドを呼び出しますが、これらはAppletStubに依存しています。AppletStubはinit()メソッドが呼び出されるまでは初期化されないため、この呼び出しは正しく動作しません。

]]>
配列オブジェクトと非配列オブジェクトのequals()による比較。 {1} でequalsメソッドを使って配列オブジェクトと非配列オブジェクトを比較しています。
このメソッドの中で、配列オブジェクトと配列でないと思われるオブジェクトを.equals(Object o)で比較しています。型が異なるのであれば、等しくないという結果になります。大抵は何かの間違いです。仮に配列同志の比較だとしても、配列オブジェクトのequalsによる比較は両者が同じものであるかを判定するだけです。配列の内容が等しいかどうかまで調べたいのであれば、java.util.Arrays.equals(Object[], Object[])を使用してください。

]]>
配列オブジェクトのequals呼び出しは、==と等価です。 配列オブジェクトのequals呼び出しは、==と等価です。
このメソッドは配列オブジェクトの.equals(Object o)メソッドを呼び出しています。配列はequalsメソッドをオーバーライドしていないため、これは参照の比較しか行ないません。配列の内容を比較するならjava.util.Array.equals(Object[], Object[])を用いなければなりません。

]]>
Objectのequalsメソッドをオーバーライドしていないfinalクラスのequalsメソッドを呼び出しています。 Objectのequalsメソッドをオーバーライドしていないfinalクラスのequalsメソッドを呼び出しています。
Objectのequalsメソッドをオーバーライドしていないfinalクラスの.equals(Object o)メソッドが呼び出されています。これは==による参照の比較と同値です。equalsメソッドを使うのは良いのですが、このクラスでequalsメソッドをオーバーライドすることを検討してください。

[Bill Pugh]: すみません、私はこの警告の出力には強く反対で、あなたのコードは全く正しいと思います。ユーザのコードはequals()の実装がどうなっているかを意識すべきではなく、==でのインスタンス比較に依存すべきではありません。このようにしてしまうと、ライブラリ側でオブジェクトの同値性を制御することができなくなってしまいます。

]]>
interrupted()を呼び出すために無駄なcurrentThread()呼び出しを行なっています。 メソッド {1} は、interrupted()を呼び出すために無駄なcurrentThread()呼び出しを行なっています。
このメソッドは、interrupted()メソッドを呼び出すためだけにThread.currentThread()を呼び出しています。interrupted()メソッドはstaticメソッドなので、単にThread.interrupted()とすれのが、より単純明解です。

]]>
staticメソッドThread.interrupted()がスレッドインスタンスに対して呼び出されています。 {1}でstaticメソッドThread.interrupted()が、スレッドインスタンスに対して呼び出されています。
このメソッドはThread.interrupted()が、自スレッドではないと思われるスレッドに対して呼び出されています。このinterrupted()メソッドはstaticメソッドであり常に自スレッドに対して呼び出されるため、コード作成者の意図とは異なるスレッドに対して呼び出されることになります。

]]>
パラメータへの変更内容は、上書きではなく単に捨てられます。 {1} へのパラメータ {2} を書き変えても、内容の上書きにはならず単に捨てられます。
引数で渡された値が無視され、ここで内容が上書きされています。パラメータの内容を書き変えれば、呼び出し元に変更が伝わるとプログラマが誤解している可能性があります。

]]>
ローカル変数への意味の無い代入。 {1} で、ローカル変数 {2} への意味の無い代入が行なわれています。
ローカル変数への代入が行なわれていますが、これ以降この値が読み出されることはありません。計算された値が結局は使用されないので、大抵の場合は間違いです。

]]>
Useless assignment in return statement Useless assignment in return from {1}
This statement assigns to a local variable in a return statement. This assignment has effect. Please verify that this statement does the right thing.

]]>
Dead store of class literal Dead store of {3}.class in {1}
This instruction assigns a class literal to a variable and then never uses it. The behavior of this differs in Java 1.4 and in Java 5. In Java 1.4 and earlier, a reference to Foo.class would force the static initializer for Foo to be executed, if it has not been executed already. In Java 5 and later, it does not.

See Sun's article on Java SE compatibility for more details and examples, and suggestions on how to force class initialization in Java 5.

]]>
ローカル変数への無駄なnull代入。 ローカル変数 {2} への無駄なnull代入が {1} にあります。
このコードはローカル変数にnullを代入していますが、この変数は、その後読み出されていません。恐らくnullを代入することで、ガーベージコレクタにヒントを与えることを意図したと思われますが、Java SE 6.0からは、このような記述は不要です。

]]>
フィールドと同名のローカル変数を定義しています。 メソッド {1} は、ローカル変数 {2.givenClass} を定義しており、これがフィールドを隠しています。
このメソッドは、このクラスもしくは親クラスが持つフィールドと同名のローカル変数を定義しています。 これにより、フィールドが初期化されなかったり、未初期化のフィールドの値を読みこんだりする恐れがあります。

]]>
親クラスで定義されたフィールドと同名のフィールドを定義しています。 親クラス{2.class}が定義しているフィールド {1.givenClass} と同名のフィールドを定義しています。
このクラスは、親クラスが定義しているフィールドと同名のフィールドを定義しています。これは混乱を招きやすく、間違えて意図しないフィールドを更新したり参照したりするプログラミングミスにつながります。

]]>
entrySetイテレータを使用すべき場所での非効率なkeySetイテレータの使用。 メソッド {1} はentrySetイテレータを使用すべき場所で、keySetイテレータを使用しているため非効率なコードになっています。
Mapの内容にkeySetイテレータから取り出したキーを用いてアクセスしています。このようなケースはentrySetを用いれば、無駄なMap.get(key)呼び出しを回避できます。

]]>
staticメソッドしか提供していないクラスのインスタンスを無駄に生成しています。 メソッド {1} は、staticメソッドしか提供していないクラスのインスタンスを無駄に生成しています。
staticメソッドしか提供していないクラスのインスタンスの生成が行なわれています。このインスタンス生成は無駄です。クラス名を使用して直接メソッドを呼び出してください。

]]>
Exceptionが発生しないのにExceptionをキャッチしています。 {1} でExceptionがキャッチされていますが、このtry節の名ではExceptionは発生しません。また、ここにはRuntimeExceptionのキャッチ節もありません。
このtry-catchブロックはtry節の中でExceptionをスローしないのにExceptionのキャッチ節があり、RuntimExceptionのキャッチ節がありません。これは同じ内容のキャッチ節を書くのが面倒でtry { ... } catch (Exception e) { something }と記述してしまい、間違ってRuntimeExceptionまでキャッチしてしまうというバグパターンです。

]]>
NaNとの無効な比較。 {1}でNaNとの無効な比較が行われています。
このコードは浮動小数点数がNaN(Not A Number)と比較されています(例:if (x == Double.NaN))。しかしNaNの定義上、全てのとり得る値はNaN自身も含めてNanとは等しくなりません。このためx == Double.NaNは常にfalseとなります。値xはNot A Numberであるかどうかを調べるにはDouble.isNaN(x) (もしもxがfloatならばFloat.isNaN(x)を代わりに使用してください。

]]>
浮動小数の同値比較。 {1}で浮動小数の同値比較が行なわれています。
2つの浮動小数の値が同値であるか比較されています。浮動小数は桁丸めが行なわれるためfloat、doubleの値は誤差を含む場合があります。勘定系の処理のように正確な値が必要な場合には、BigDecimalのような固定小数を使用する事を検討してください。誤差があっても良いケースならば、値の差がある範囲ならば同値であると判断する事を検討してください。これは例えば次のようにします。 if ( Math.abs(x - y) < .0000001 ). 詳しくはJava言語仕様4.2.4.を参照してください。

]]>
定数に対するMathクラスのstaticメソッド呼び出し。 定数に対してMathクラスのstaticメソッドが呼び出されています。
このメソッド内でjava.lang.Mathのstaticメソッドを定数に対して呼び出しています。この結果は予め計算しておく事が可能であり、その方が高速で場合によってはより正確です。以下のメソッド呼び出しが検出されます。 absacosasinatanatan2cbrtceilcoscoshexpexpm1floorloglog10rintroundsinsinhsqrttantanhtoDegreestoRadians
メソッドパラメータ
-任意-
0.0 か 1.0
0.0 か 1.0
0.0 か 1.0
0.0
0.0 か 1.0
-任意-
0.0
0.0
0.0 か 1.0
0.0
-任意-
0.0 か 1.0
0.0 か 1.0
-任意-
-任意-
0.0
0.0
0.0 か 1.0
0.0
0.0
0.0 か 1.0
0.0

]]>
クラス間の循環依存関係。 クラス {0} は、他のクラスと循環依存関係にあります。
このクラスは、他のクラスと循環依存関係にあります。このため、それぞれクラスのコンパイルの際に別のクラスがコンパイル済である必要があり、全体のコンパイルが難しいものになっています。インターフェースを用いて強い依存関係を断ち切る事を検討してください。

]]>
親クラスが実装しているインターフェースをもう一度実装宣言しています。 クラス {0} は親クラスが実装しているインターフェースをもう一度実装宣言しています。
このクラスで実装を宣言しているインターフェースは、親クラスでも実装が宣言されています。一度実装が宣言されたインターフェースは、全サブクラスで自動的に実装されることになるため、この記述は冗長です。このクラスが作成された後に継承関係が変更された可能性があります。実装するべきインターフェースについて再度検討する必要があります。

]]>
Struts Actionの継承クラスでのインスタンスフィールドの使用。 クラス {0} はStruts Actionクラスを継承しており、インスタンスフィールドを使用しています。
このクラスはStruts Actionクラスを継承しており、インスタンスフィールドを使用しています。Struts Actionクラスのインスタンスは複数のリクエストに対して1つしか生成されません。このためインスタンスフィールドは複数のスレッドから同時にアクセスされることになるので、このクラスでのインスタンスフィールドの使用は控えるべきであり、また恐らく使い方が間違っています。ローカル変数のみを使用するように変更することを検討してください。

]]>
Servletクラスを継承しているクラスでのインスタンスフィールドの使用。 クラス {0} はServletクラスを継承しており、インスタンスフィールドを使用しています。
このクラスはServletクラスを継承しており、インスタンスフィールドを使用しています。サーブレットクラスのインスタンスは複数のリクエストに対して1つしか生成されません。このためインスタンスフィールドは複数のスレッドから同時にアクセスされることになるので、このクラスでのインスタンスフィールドの使用は控えるべきであり、また恐らく使い方が間違っています。ローカル変数のみを使用するように変更することを検討してください。

]]>
同期化とセマフォの公開インターフェースへの暴露。 クラス {0} は同期化とセマフォを公開インターフェースに暴露しています。
このクラスは、thisに対するwait(), notify() notifyAll()呼び出しによって、同期化を行なっています。利用者は、更に自分が作成したクラスの中で、このクラスのインスタンスを同期化のために使用してしまうかもしれません。これにより2つのクラスが同じオブジェクトを使って同期化を行なってしまうので、マルチスレッド処理が正しく行なわれなくなる可能性があります。外から見える参照を使って同期化、セマフォメソッド呼び出しを行なうべきではありません。privateメンバフィールドを利用して同期化を行なうことを検討してください。

]]>
intの乗算結果をlongにキャストしています。 {1}で、intの乗算結果をlongにキャストしています。
このコードはintの乗算を計算してから結果をlongに変換しています。
 
	long convertDaysToMilliseconds(int days) { return 1000*3600*24*days; } 
longの演算を用いて乗算を行うことで、オーバーフローしてしまう可能性を避けることができます。例えば、以下のように修正します。
 
	long convertDaysToMilliseconds(int days) { return 1000L*3600*24*days; } 
あるいは、
 
	static final long MILLISECONDS_PER_DAY = 24L*3600*1000;
	long convertDaysToMilliseconds(int days) { return days * MILLISECONDS_PER_DAY; } 

]]>
intがfloatにキャストされてから、Math.roundに渡されています。 {1}intがfloatにキャストされてから、Math.roundに渡されています。
このコードはintをfloatに変換してから、Math.round()に渡して、丸め処理をしています。intからfloatへの変換では小数点以下の部分は使用されないので、結局この処理には意味がありません。恐らくMath.roundに渡している式の計算を、浮動小数点数で行いたかったものと思われます。

]]>
intのdoubleへのキャスト後のMath.ceilへの引き渡し。 {1}でintがdoubleにキャストされた後にMath.ceilに引き渡されています。
このコードはintを倍精度小数点数に変換した後に、doubleを最も近い次の整数値に丸めるMath.ceil()メソッドに引き渡しています。整数からdoubleへの変換は小数点以下を切り捨てるので、結果として無駄な処理となっています。Math.ceil()に渡している値の計算が倍精度小数点数の計算だと思っているのかもしれません。

]]>
intの除算結果のdoubleへのキャスト。 {1}でintの除算結果をdoubleにキャストしています。
このコードはintの除算結果をdoubleにキャストしています。整数の除算は丸めが切り捨てが行われます。doubleへのキャストは、精度が維持されると考えている事を示唆しています。恐らくコードの意図は除算の前にdoubleへのキャストを行なうことだったと考えられます。以下に例を示します。

int x = 2;
int y = 5;
// 間違い: 結果は0.0となる
double value1 =  x / y;

// 正しい: 結果は0.4となる
double value2 =  x / (double) y;
]]>
HttpSessionへの直列化できないオブジェクトの格納。 {1}で、直列化できないオブジェクト {2} をHttpSessionに格納しています。
このコードは直列化できないオブジェクトをHttpSessionに格納しているようです。このセッションがコンテナによって非活性化されて移動されると、正しく動作しない可能性があります。

]]>
直列化できないオブジェクトのObjectOutputへの書き込み。 {1} で直列化できないオブジェクト {2} がObjectOutputに書き込まれています。
このコードは直列化できないオブジェクトをObjectOutput.writeObjectメソッドに渡しているようです。このオブジェクトが実際に直列化できないのであれば結果はエラーとなります。

]]>
Number of format-string arguments does not correspond to number of placeholders Format-string method {2} called with format string "{3}" wants {4} arguments but is given {5} in {1}
A format-string method with a variable number of arguments is called, but the number of arguments passed does not match with the number of % placeholders in the format string. This is probably not what the author intended.

]]>
可変引数をとるメソッドへのプリミティブ型の配列の引き渡し。 {1} で{2}が可変引数をとるメソッド{3}に渡されています。
このコードは可変引数をとるメソッドにプリミティブ型の配列を渡しています。これは結局、要素型が配列である、サイズ1の配列が生成されて、その要素にこのプリミティブ型の配列が格納されてメソッドに渡されることになります。

]]>
equalsメソッドは引数の型を仮定してはいけません。 {0} のequalsメソッドは、型{0.givenClass}を仮定してはいけません。
equals(Object o)は引数oの型に対して仮定を置いてはいけません。もしもoが、thisと互換性の無い型であれば、単純にfalseを返さなければなりません。

]]>
抽象コレクション型への疑わしいキャスト。 {1}でコレクションが抽象コレクション型{3}にキャストされています。
このコードはコレクションを抽象コレクション型(例えばListSetMap)にキャストしています。そのオブジェクトは既にキャスト先の型でもあることに注意してください。また単にコレクションの中身を走査するだけなら、SetやListにキャストする必要はありません。

]]>
プリミティブ型の配列を含んだ不可能なキャスト。 {1}でプリミティブ型の配列を含んだ不可能なキャストが行われています。
このキャストは常にClassCastExceptionのスローを招きます。

]]>
不可能なキャスト。 {1}で{2}から{3}への不可能なキャストが行なわれています。
このキャストは常にClassCastExceptionのスローを招きます。

]]>
nullと分かっている値をinstanceofで型チェックしています。 {1} でnullと分かっている値の型が {2} であるかどうかinstanceofでチェックしています。
このinstanceofは常にfalseを返します。なぜならこの値はnullであることが明らかだからです。このコードは安全ではありますが、何らかの論理の間違い、誤解を示唆しています。

]]>
nullと分かっている値をinstanceofで型チェックしています。 {1} でnullと分かっている値の型が {2} であるかどうかinstanceofでチェックしています。
このinstanceofは常にfalseを返します。なぜならこの値はnullであることが明らかだからです。このコードは安全ではありますが、何らかの論理の間違い、誤解を示唆しています。

]]>
常にfalseを返すinstanceof。 {2}は{3}ではないため、{1}のinstanceofは常にfalseを返します。
このinstanceofは常にfalseを返します。もちろんこれ自体は無害ですが、ロジックに誤解や間違いがないかコードを見直してください。

]]>
常にtrueを返すinstanceof。 {2}は常に{3}であるため、{1}のinstanceofは常にtrueを返します。
このinstanceofは常にtrueを返します。もちろんこれ自体は無害ですが、ロジックに誤解や間違いがないかコードを見直してください。

]]>
チェック/確認されていないキャスト。 {1}における{2}から{3}へのキャストはチェック/確認されていません。
このキャストはチェックされていません。キャスト元のインスタンスの全てがキャスト先の型にキャストできるわけではありません。プログラムのロジックを見直して、このキャストが失敗しないかどうか確認してください。

]]>
具象コレクションクラスへの疑わしいキャスト。 {1}で{2}から{3}への疑わしいキャストが行なわれています。
このコードは抽象コレクション型(例えばCollection, List, Set)を具象コレクションクラス(例えばArrayList, HashSet)にキャストしています。これは正しくないかもしれません。また具象コレクションクラスを将来変更することができなくなるので、コードが脆いものとなってしまいます。特に理由がなければ抽象コレクション型をそのまま使用してください。

]]>
"."は正規表現です。 {1} で使用されている"."は正規表現のメタキャラクタです。
Stringの正規表現を受け取るメソッドに"."が渡されています。これは意図通りですか?
例えば、s.replaceAll(".", "/")は、全ての文字を"/"に置き換えた文字列を返します。

]]>
正規表現の文法ミス。 {1}に文法の間違った正規表現があります。
このコードで使用されている正規表現は文法が間違っています。この文はPatternSyntaxExceptionのスローを招くでしょう。

]]>
File.separatorが正規表現で使用されています。 {1} でFile.separatorが正規表現に使用されています。
正規表現が必要とされる場所で、File.separatorが使用されています。これはWindowsプラットフォームでは正しく動作しません。File.separatorがバックスラッシュとなるためです。これは正規表現のエスケープキャラクタです。回避方法として、File.separatorChar=='\\' & "\\\\" : File.separatorを、File.separatorの替わりに使用する方法があります。

]]>
インクリメントの上書き。 {1}でインクリメントの上書きが行なわれています。
このコードはインクリメント操作(すなわちi++)の後、ただちに内容を上書きしています。例えば、i = i++は、インクリメントされた値を元の値で上書きします。

]]>
符号無し右シフトのshort/byteへのキャスト。 {1}で符号無し右シフト結果をshort/byteにキャストしています。
このコードは符号無し右シフトを行なった後、結果をshortあるいはbyteにキャストしています。これは(シフト量によりますが)上位ビットを捨ててしまうので、符号無しでも符号ありでも一緒のはずです。

]]>
0から31をこえるint値のビットシフト。 {1}でint値が{2}だけシフトされています。
このコードはint値が定数でシフトされていますが0から31の範囲をこえています。実際のシフト量は下位5bit(訳注:つまり32で割った余り)が使用されますが、恐らく意図とは違うものであり、少なくとも混乱を招きます。

]]>
整数の剰余結果への整数乗算の実行。 {1}で整数の剰余結果に整数乗算が実行されています。
このコードは整数の剰余結果に整数定数を掛け合わせています。演算子の優先順位を誤解していませんか? 例えばi % 60 * 1000は、i % (60 * 1000)ではなく(i % 60) * 1000となります。

]]>
配列に対するtoStringメソッド呼び出し。 {1} で配列に対してtoStringを呼び出しています。
このコードは配列に対してtoStringを呼び出しています。これは"[C@16f0472"のような、あまり意味の無い結果を返します。かわりにArrays.toStringを使って配列の中身が分かるような文字列表現を得ることを検討してください。プログラミングパズルの第3章、パズル12を参照してください。

]]>
Invocation of toString on an array Invocation of toString on an array in {1}
The code invokes toString on an (anonymous) array. Calling toString on an array generates a fairly useless result such as [C@16f0472. Consider using Arrays.toString to convert the array into a readable String that gives the contents of the array. See Programming Puzzlers, chapter 3, puzzle 12.

]]>
オーバーフローの可能性がある平均値計算。 {1}の平均値計算はオーバーフローの可能性があります。
このコードは2つの整数の平均値を計算するのに、除算あるいは符号付き右ビットシフトを使用し、得られた結果を配列の添字に使用しています。もしも平均値計算の元となる値が非常に大きい値だと、オーバーフローして負となり、負の数の平均値計算となるかもしれません。結果が負になることを想定していないのであれば、代わりに符号無し右ビットシフトを使用することを検討してください。つまり(low+high)/2の代わりに(low+high) >>> 1を使用します。

このバグは昔の二分探索、マージソートで多く見られます。Martin Buchholz がJDKの中に、このバグを発見、修正しています。またJoshua Blochがより一般化したバグパターンの話として紹介しています。

]]>
この奇数判定は、負の数では正しく動作しません。 {1} で使用されている奇数判定は、負の数に対しては正しく動作しません。
ここで使用されている x % 2 == 1 という式は奇数であるかを判定していると思われますが、これは負の数に対しては正しく動作しないことに注意してください(例:(-5) % 2 == -1)。かわりに x & 1 == 1 か x % 2 != 0を使用することを検討してください。

]]>
絶対パスのハードコード。 {1} で絶対パスがハードコードされています。
このコードはハードコードされた絶対パスでFileオブジェクトを生成しています。 (例:new File("/home/dannyc/workspace/j2ee/src/share/com/sun/enterprise/deployment");)

]]>
不正な月定数。 {1}で間違った月の値{2}が{3}に渡されています。
このコードは月の定数として0から11の範囲を超えた値を使用しています。

]]>
substring(0)の呼び出しは元と同じ値を返します。 {1} でのsubstring(0)の呼び出しは元と同じ値を返します。
このコードはsubstring(0)を呼び出していますが、これは元のStringと同じものを返します。

]]>
hasNextメソッドの中でnextメソッドを呼び出し。 {1} で {3} を呼び出しています。
hasNext() で next() を呼び出しています。hasNext()はイテレータの状態を変えるものではなく、next()メソッドがイテレータの状態を変えるはずなので、このコードは恐らくほとんどの場合間違っています。

]]>
ロックを保持したままでのThread.sleep()の呼び出し。 {1} でロックを保持したままThread.sleep()を呼び出しています。
このメソッドはロックを保持したままThread.sleep()を呼び出しています。これはパフォーマンスとスケーラビリティを極度に悪化させ、あるいはデッドロックを引き起こします。なぜなら他の複数のスレッドがロックの獲得のために待っているかもしれないからです。wait()を呼び出してロックを待ち合わせるのが良い方法です。これによりロックが開放され他のスレッドが実行できるようになります。

]]>
両条件でのコードが同一。 {1}で両方の条件に同じコードが記述されています。
このメソッドに記述された複数の条件分岐で、同じコードが書かれています。コーディングミスでないかどうか確認してください。

]]>
switch文の中に同じコードがあります。 メソッド {1} の中のswitch文の中に同じコードがあります。
このメソッドの中にあるswitch文には、同じコードがあります。単なるコードの重複かもしれませんが、コーディングミスの可能性もあります。

]]>
エンクロージングクラスのprivateフィールドにアクセスしています。 メソッド {1} はエンクロージングクラスのprivateフィールドにアクセスしています。
この内部クラスのメソッドは、エンクロージングクラスのprivateフィールドに書き込んでいます。これを実現するためにコンパイラはフィールドにアクセスするための特別なメソッドを生成するため、コードの実行効率が犠牲になります。アクセス制限を緩めれば、コンパイラは通常のフィールドアクセス用コードを生成できます。

]]>
XML関連のインターフェースの実装を直接生成しています。 メソッド {1} でXML関連のインターフェースの実装を直接生成しています。
このメソッドはXML関連のインターフェースの特定の実装を直接生成しています。ファクトリクラスを使って生成するのが望ましいやり方です。これににより実行時に仕様する実装を切り替えることが出来ます。詳細は以下を参照してください。

  • javax.xml.parsers.DocumentBuilderFactory
  • javax.xml.parsers.SAXParserFactory
  • javax.xml.transform.TransformerFactory
  • /ul>

    ]]>
親クラスのメソッドへの不必要な移譲 メソッド {1} は不必要に親クラスのメソッドに移譲を行っています。
このメソッドは単に親クラスのメソッドを同じパラメータで呼び出しているに過ぎません。このメソッドには何の価値もなく、削除可能です。

]]>
インターフェースに定義済みのメソッドの抽象メソッド宣言。 抽象メソッド {1} は実装しているインターフェースに宣言されています。
この抽象メソッドは、このクラスが実装しているインターフェースに宣言されています。このメソッドには何の価値もなく、削除可能です。

]]>
finalクラスでのprotectedフィールド宣言。 クラス {0} はfinalですが、protectedフィールド {1} を宣言しています。
このクラスはfinal宣言されていますが、protectedなフィールドが宣言されています。このクラスは継承できないのですから、protectedフィールドを宣言すると誤解を招きます。アクセス修飾はprivateかpublic(訳注:かパッケージプライベート)に変更して、正しくフィールドが利用されるようにすべきです。

]]>
boolean式でのboolean直定数の代入。 メソッド {1} でboolean式の中でboolean直定数を代入しています。
このメソッドで、ifもしくはwhileの条件式の中でboolean直定数(trueあるいはfalse)をboolean変数に代入しています。恐らく== でbooleanの比較すべきところを、=と間違えてしまったものと思われます。

]]>
解決できないクラス、メソッドへの参照の生成。 {0} は解決できない参照 {1} を生成しています。
このクラスは解析中のライブラルでは解決できないクラス、メソッドへの参照を生成しています。

]]>
型パラメータとメソッド引数の型に互換性がありません。 {1}で使用されている{3}は、本来期待される型{2}と互換性がありません。
このジェネリックメソッドの引数型は、コンテナの型パラメータの型と異なるものです。このため、コンテナが引数の型のオブジェクトを保持していることは考えにくいです。

]]>
Static Calendar Found static field of type java.util.Calendar in {1}
Even though the JavaDoc does not contain a hint about it, Calendars are inherently unsafe for multihtreaded use. Sharing a single instance across thread boundaries without proper synchronization will result in erratic behavior of the application. Under 1.4 problems seem to surface less often than under Java 5 where you will probably see random ArrayIndexOutOfBoundsExceptions or IndexOutOfBoundsExceptions in sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate().

You may also experience serialization problems.

Using an instance field is recommended.

For more information on this see Sun Bug #6231579 and Sun Bug #6178997.

]]>
Call to static Calendar Call to method of static java.util.Calendar in {1}
Even though the JavaDoc does not contain a hint about it, Calendars are inherently unsafe for multihtreaded use. The detector has found a call to an instance of Calendar that has been obtained via a static field. This looks suspicous.

For more information on this see Sun Bug #6231579 and Sun Bug #6178997.

]]>
Static DateFormat Found static field of type java.text.DateFormat in {1}
As the JavaDoc states, DateFormats are inherently unsafe for multithreaded use. Sharing a single instance across thread boundaries without proper synchronization will result in erratic behavior of the application.

You may also experience serialization problems.

Using an instance field is recommended.

For more information on this see Sun Bug #6231579 and Sun Bug #6178997.

]]>
Call to static DateFormat Call to method of static java.text.DateFormat in {1}
As the JavaDoc states, DateFormats are inherently unsafe for multithreaded use. The detector has found a call to an instance of DateFormat that has been obtained via a static field. This looks suspicous.

For more information on this see Sun Bug #6231579 and Sun Bug #6178997.

]]>
Value annotated as carrying a type qualifier used where a value that must not carry that qualifier is required Value annotated as carrying type qualifier @{2.excludingPackage} used where a value that must not carry that qualifier is required
A value specified as carrying a type qualifier annotation is consumed in a location or locations requiring that the value not carry that annotation.

More precisely, a value annotated with a type qualifier specifying when=ALWAYS is guaranteed to reach a use or uses where the same type qualifier specifies when=NEVER.

For example, say that @NonNegative is a nickname for the type qualifier annotation @Negative(when=When.NEVER). The following code will generate this warning because the return statement requires a @NonNegative value, but receives one that is marked as @Negative.

public @NonNegative Integer example(@Negative Integer value) {
    return value;
}
]]>
Value annotated as never carrying a type qualifier used where value carrying that qualifier is required Value annotated as never carrying type qualifier @{2.excludingPackage} used where value carrying that qualifier is required
A value specified as not carrying a type qualifier annotation is guaranteed to be consumed in a location or locations requiring that the value does carry that annotation.

More precisely, a value annotated with a type qualifier specifying when=NEVER is guaranteed to reach a use or uses where the same type qualifier specifies when=ALWAYS.

TODO: example

]]>
Value that might not carry a type qualifier reaches a use requiring that type qualifier Value that might not carry the @{2.excludingPackage} annotation reaches a use requiring that annotation
A value that might not carry a type qualifier annotation reaches a use which requires that annotation.

For example, consider the following method:

public @Untainted Object mustReturnUntainted(Object unknown) {
    return unknown;
}

The mustReturnUntainted method is required to return a value carrying the @Untainted annotation, but a value not known to carry that annotation is returned.

]]>
Unknown value reaches a use which forbids values carrying type qualifier annotation Unknown value reaches a use which forbids values carrying the @{2.excludingPackage} annotation
A value which might carry a type qualifier annotation reaches a use which forbids values carrying that annotation.

TODO: example.

]]>
Doomed attempt to append to an object output stream Doomed attempt to append to an object output stream in {1}
This code opens a file in append mode and then wraps the result in an object output stream. This won't allow you to append to an existing object output stream stored in a file. If you want to be able to append to an object output stream, you need to keep the object output stream open.

The only situation in which opening a file in append mode and the writing an object output stream could work is if on reading the file you plan to open it in random access mode and seek to the byte offset where the append started.

TODO: example.

]]>
Sychronization on getClass rather than class literal Sychronization on getClass rather than class literal in {1}
This instance method synchronizes on this.getClass(). If this class is subclassed, subclasses will synchronize on the class object for the subclass, which isn't likely what was intended. For example, consider this code from java.awt.Label:
     private static final String base = "label";
     private static int nameCounter = 0;
     String constructComponentName() {
        synchronized (getClass()) {
            return base + nameCounter++;
        }
     }
     

Subclasses of Label won't synchronize on the same subclass, giving rise to a datarace. Instead, this code should be synchronizing on Label.class

     private static final String base = "label";
     private static int nameCounter = 0;
     String constructComponentName() {
        synchronized (Label.class) {
            return base + nameCounter++;
        }
     }
     

Bug pattern contributed by Jason Mehrens

]]>
Analysis skipped 無限ループ volatileの使用方法 安全でない継承 floatの精度の利用 プロトタイプ、未完成バグパターンのためのテスト用 IllegalMonitorStateException の疑わしいキャッチ。 cloneable 表現の誤った実装。 Possible atomicity violation ファイナライザの使用方法が間違っています。 文字列の一致を == や != を使って比較しています 更新されるフィールドで同期を取ろうとしています。(ミュータブルロック) 同期化(synchronized)されていないgetメソッドで、同期化されているsetメソッドです。 Input/Output problem 初期化がループしています。 疑わしいスタティック初期化子 Mutable servlet field 同期の仕方に一貫性がありません。 equals()の問題。 compareTo()の問題。 同じ(equal)オブジェクトは同じハッシュ値を持つべきです。 APIの誤用 疑わしいメソッドを使っています。 疑わしいプリミティブ型の値のボクシング。 コンストラクタで初期化の前にフィールドの値を読んでいます。 メソッドでInputStream.read()の戻り値を無視しています。 裸のnotify。 無条件のwait。 メソッドでフィールドのスピンロックをしています。 フィールドをダブルチェックしている可能性があります。 waitがループ内にありません。 notifyAll() ではなく notify() を使っています。 例外を見落としている、または無視しています。 メソッドで run() を直接実行しています。 iteratorの宣言が不正です。 Version IDを持たない直列化可能クラス 直列化(Serializable)クラスの宣言が不正です。 クラスのwriteObject()メソッドは同期化(sunchronized)されていますが、それ以外のメソッドは適切に宣言されていません。 クラスの readObject()メソッドが同期化(synchronized)されています。 コンストラクタが Thread.start() を呼んでいます。 スタティックフィールドがミュータブル(mutable)です。 配列を返すメソッドは 内部表現を暴露してしまう可能性があります。 メソッド名がまぎらわしいです。 読まれないフィールドは、スタティック宣言すべきです。 利用されていないフィールドがあります。 読まれないフィールドがあります。 書かれないフィールドがあります。 スタティックな内部クラスにする事が可能です 2つのロックを持ったままwaitしています。 メソッドの戻り値の間違った利用。 あいまいな呼び出し。 巨大な文字列定数。 HTTP Response splitting vulnerability Cross site scripting vulnerabilitity nullポインタを参照外ししています。 ストリームがクローズされない経路があります。 結果無しを指し示すためには、nullよりもむしろ0の長さの配列を利用した方が良いです。 無駄な制御の流れがあります。 nullに対する冗長な比較があります。 ロックが解放されない経路があります。 疑わしい比較演算子の参照があります。 疑わしいequals()による比較 wait() か notify()の組み合せが間違っています。 無駄な自己操作です。 疑わしい整数式 疑わしいビット演算式 同期化(synchronized)されていない遅延初期化です。 JSR166 の Lock による同期。 private メソッドは一度も呼ばれません。 呼び出し不能な匿名クラスのメソッド ミュータブルオブジェクトの参照の格納。 非短絡論理演算子の疑わしい利用。 データベースリソースがクローズされない経路があります。 ループ内での+を用いたStringの連結。 非効率なCollection.toArray(new Foo[0])呼び出し Swingのコーディングルール JUnit TestCaseの正しくない実装 不適切にオーバーライドされたアダプタ switch caseのフォールスルー 余計なinstanceof 間違ったアプレットのコンストラクタ Objectのequalsの使用 疑わしいThreadのinterrupted呼び出し 意味の無いローカル変数への代入 引数の無視 マスクフィールド 間違ったMapイテレータ staticクラスのインスタンス生成 RuntimeExceptionの捕捉 浮動小数の同値比較 不要なMath定数 循環依存 冗長なインターフェース インスタンスへのマルチスレッドアクセス 公開セマフォ 整数のキャスト 正規表現 SQLの問題 Potential deadlock or unexpected blocking Possible locking on wrong object 空のsynchronizedブロック 疑わしいforループ 可変引数の問題 間違った参照のキャスト 疑わしい整数計算 staticフィールドの間違った使用 net.jcip annotationsアノテーションの違反 疑わしいメソッド呼び出し Josh BlochとNeal Gafterによるプログラミングパズルにインスパイアされた警告。 ロックを持ったままでのSleep J2EEに関するエラー 分岐の二重コード 非効率なメンバへのアクセス XMLファクトリの無視 無駄な継承クラスのメソッド 紛らわしい継承 疑わしいboolean値の代入 バージョン互換性の問題 doPrivilegedの使用 コンテナの汎用型メソッドの疑わしい呼び出し Static use of type Calendar or DateFormat Inconsistent use of type qualifier annotations