OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.or
g/TR/html4/loose.dtd"> |
| 2 <html><head><title>FindBugs Bug Descriptions</title> |
| 3 <link rel="stylesheet" type="text/css" href="findbugs.css"/> |
| 4 <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/> |
| 5 </head><body> |
| 6 |
| 7 <table width="100%"><tr> |
| 8 |
| 9 <td bgcolor="#b9b9fe" valign="top" align="left" width="20%"> |
| 10 <table width="100%" cellspacing="0" border="0"> |
| 11 <tr><td><a class="sidebar" href="index.html"><img src="umdFindbugs.png" alt="Fin
dBugs"></a></td></tr> |
| 12 |
| 13 <tr><td> </td></tr> |
| 14 |
| 15 <tr><td><b>Docs and Info</b></td></tr> |
| 16 <tr><td><font size="-1"> <a class="sidebar" href="findbugs2.html">FindBugs
2.0</a></font></td></tr> |
| 17 <tr><td><font size="-1"> <a class="sidebar" href="demo.html">Demo and data<
/a></font></td></tr> |
| 18 <tr><td><font size="-1"> <a class="sidebar" href="users.html">Users and sup
porters</a></font></td></tr> |
| 19 <tr><td><font size="-1"> <a class="sidebar" href="http://findbugs.blogspot.
com/">FindBugs blog</a></font></td></tr> |
| 20 <tr><td><font size="-1"> <a class="sidebar" href="factSheet.html">Fact shee
t</a></font></td></tr> |
| 21 <tr><td><font size="-1"> <a class="sidebar" href="manual/index.html">Manual
</a></font></td></tr> |
| 22 <tr><td><font size="-1"> <a class="sidebar" href="ja/manual/index.html">Man
ual(ja/日本語)</a></font></td></tr> |
| 23 <tr><td><font size="-1"> <a class="sidebar" href="FAQ.html">FAQ</a></font><
/td></tr> |
| 24 <tr><td><font size="-1"> <a class="sidebar" href="bugDescriptions.html">Bug
descriptions</a></font></td></tr> |
| 25 <tr><td><font size="-1"> <a class="sidebar" href="bugDescriptions_ja.html">
Bug descriptions(ja/日本語)</a></font></td></tr> |
| 26 <tr><td><font size="-1"> <a class="sidebar" href="bugDescriptions_fr.html">
Bug descriptions(fr)</a></font></td></tr> |
| 27 <tr><td><font size="-1"> <a class="sidebar" href="mailingLists.html">Mailin
g lists</a></font></td></tr> |
| 28 <tr><td><font size="-1"> <a class="sidebar" href="publications.html">Docume
nts and Publications</a></font></td></tr> |
| 29 <tr><td><font size="-1"> <a class="sidebar" href="links.html">Links</a></fo
nt></td></tr> |
| 30 |
| 31 <tr><td> </td></tr> |
| 32 |
| 33 <tr><td><a class="sidebar" href="downloads.html"><b>Downloads</b></a></td></tr> |
| 34 |
| 35 <tr><td> </td></tr> |
| 36 |
| 37 <tr><td><a class="sidebar" href="http://www.cafeshops.com/findbugs"><b>FindBugs
Swag</b></a></td></tr> |
| 38 |
| 39 <tr><td> </td></tr> |
| 40 |
| 41 <tr><td><b>Development</b></td></tr> |
| 42 <tr><td><font size="-1"> <a class="sidebar" href="http://sourceforge.net/tr
acker/?group_id=96405">Open bugs</a></font></td></tr> |
| 43 <tr><td><font size="-1"> <a class="sidebar" href="reportingBugs.html">Repor
ting bugs</a></font></td></tr> |
| 44 <tr><td><font size="-1"> <a class="sidebar" href="contributing.html">Contri
buting</a></font></td></tr> |
| 45 <tr><td><font size="-1"> <a class="sidebar" href="team.html">Dev team</a></
font></td></tr> |
| 46 <tr><td><font size="-1"> <a class="sidebar" href="api/index.html">API</a> <
a class="sidebar" href="api/overview-summary.html">[no frames]</a></font></td></
tr> |
| 47 <tr><td><font size="-1"> <a class="sidebar" href="Changes.html">Change log<
/a></font></td></tr> |
| 48 <tr><td><font size="-1"> <a class="sidebar" href="http://sourceforge.net/pr
ojects/findbugs">SF project page</a></font></td></tr> |
| 49 <tr><td><font size="-1"> <a class="sidebar" href="http://code.google.com/p/
findbugs/source/browse/">Browse source</a></font></td></tr> |
| 50 <tr><td><font size="-1"> <a class="sidebar" href="http://code.google.com/p/
findbugs/source/list">Latest code changes</a></font></td></tr> |
| 51 </table> |
| 52 </td> |
| 53 <td align="left" valign="top"> |
| 54 <h1>FindBugs Bug Descriptions</h1> |
| 55 <p>This document lists the standard bug patterns reported by |
| 56 <a href="http://findbugs.sourceforge.net">FindBugs</a> version 3.0.0.</p> |
| 57 <h2>Summary</h2> |
| 58 <table width="100%"> |
| 59 <tr bgcolor="#b9b9fe"><th>Description</th><th>Category</th></tr> |
| 60 <tr bgcolor="#eeeeee"><td><a href="#BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS
">BC: equals メソッドは引数の型を仮定するべきではない</a></td><td>Bad practice</td></tr> |
| 61 <tr bgcolor="#ffffff"><td><a href="#BIT_SIGNED_CHECK">BIT: ビット演算の符号をチェックする</a></
td><td>Bad practice</td></tr> |
| 62 <tr bgcolor="#eeeeee"><td><a href="#CN_IDIOM">CN: Cloneable を実装したクラスが clone メソッド
を定義していないか、使用していない</a></td><td>Bad practice</td></tr> |
| 63 <tr bgcolor="#ffffff"><td><a href="#CN_IDIOM_NO_SUPER_CALL">CN: clone メソッドが supe
r.clone() を呼び出していない</a></td><td>Bad practice</td></tr> |
| 64 <tr bgcolor="#eeeeee"><td><a href="#CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE">CN: C
loneable を実装していないクラスが clone メソッドを定義している</a></td><td>Bad practice</td></tr> |
| 65 <tr bgcolor="#ffffff"><td><a href="#CNT_ROUGH_CONSTANT_VALUE">CNT: 既知の定数の雑な値を見つけ
る</a></td><td>Bad practice</td></tr> |
| 66 <tr bgcolor="#eeeeee"><td><a href="#CO_ABSTRACT_SELF">Co: 抽象クラスは共変な compareTo メソ
ッドを定義している</a></td><td>Bad practice</td></tr> |
| 67 <tr bgcolor="#ffffff"><td><a href="#CO_SELF_NO_OBJECT">Co: 共変な compareTo メソッドの定義
</a></td><td>Bad practice</td></tr> |
| 68 <tr bgcolor="#eeeeee"><td><a href="#DE_MIGHT_DROP">DE: 例外を捨てているかもしれないメソッド</a></t
d><td>Bad practice</td></tr> |
| 69 <tr bgcolor="#ffffff"><td><a href="#DE_MIGHT_IGNORE">DE: 例外を無視しているかもしれないメソッド</a>
</td><td>Bad practice</td></tr> |
| 70 <tr bgcolor="#eeeeee"><td><a href="#DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS">DMI:
エントリセットの要素を加えることは、Entry オブジェクトの再利用のために失敗するかもしれない</a></td><td>Bad practice</td><
/tr> |
| 71 <tr bgcolor="#ffffff"><td><a href="#DMI_RANDOM_USED_ONLY_ONCE">DMI: Random オブジェク
トが作成され1度しか使われない</a></td><td>Bad practice</td></tr> |
| 72 <tr bgcolor="#eeeeee"><td><a href="#DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION">DMI
: コレクションを消去するために removeAll メソッドを使用しない</a></td><td>Bad practice</td></tr> |
| 73 <tr bgcolor="#ffffff"><td><a href="#DM_EXIT">Dm: System.exit(...) を呼び出しているメソッド</
a></td><td>Bad practice</td></tr> |
| 74 <tr bgcolor="#eeeeee"><td><a href="#DM_RUN_FINALIZERS_ON_EXIT">Dm: 危険なメソッド runFi
nalizersOnExit を呼び出しているメソッド</a></td><td>Bad practice</td></tr> |
| 75 <tr bgcolor="#ffffff"><td><a href="#ES_COMPARING_PARAMETER_STRING_WITH_EQ">ES: S
tring パラメータを == や != を使用して比較している</a></td><td>Bad practice</td></tr> |
| 76 <tr bgcolor="#eeeeee"><td><a href="#ES_COMPARING_STRINGS_WITH_EQ">ES: String オブジ
ェクトを == や != を使用して比較している</a></td><td>Bad practice</td></tr> |
| 77 <tr bgcolor="#ffffff"><td><a href="#EQ_ABSTRACT_SELF">Eq: 抽象クラスは共変な equals メソッドを
宣言している</a></td><td>Bad practice</td></tr> |
| 78 <tr bgcolor="#eeeeee"><td><a href="#EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THI
S">Eq: equals メソッドは互換性のないオペランドをチェックしている</a></td><td>Bad practice</td></tr> |
| 79 <tr bgcolor="#ffffff"><td><a href="#EQ_COMPARETO_USE_OBJECT_EQUALS">Eq: compareT
o(...) メソッドを定義して Object.equals() を使用しているクラス</a></td><td>Bad practice</td></tr> |
| 80 <tr bgcolor="#eeeeee"><td><a href="#EQ_GETCLASS_AND_CLASS_CONSTANT">Eq: equals メ
ソッドはサブタイプのために失敗する</a></td><td>Bad practice</td></tr> |
| 81 <tr bgcolor="#ffffff"><td><a href="#EQ_SELF_NO_OBJECT">Eq: 共変な equals メソッドの定義</a
></td><td>Bad practice</td></tr> |
| 82 <tr bgcolor="#eeeeee"><td><a href="#FI_EMPTY">FI: 空のファイナライザは削除するべき</a></td><td>B
ad practice</td></tr> |
| 83 <tr bgcolor="#ffffff"><td><a href="#FI_EXPLICIT_INVOCATION">FI: ファイナライザの明示的な呼び出し
</a></td><td>Bad practice</td></tr> |
| 84 <tr bgcolor="#eeeeee"><td><a href="#FI_FINALIZER_NULLS_FIELDS">FI: ファイナライザはフィールド
を null にする</a></td><td>Bad practice</td></tr> |
| 85 <tr bgcolor="#ffffff"><td><a href="#FI_FINALIZER_ONLY_NULLS_FIELDS">FI: ファイナライザは
フィールドを null にするだけ</a></td><td>Bad practice</td></tr> |
| 86 <tr bgcolor="#eeeeee"><td><a href="#FI_MISSING_SUPER_CALL">FI: ファイナライザはスーパークラスのフ
ァイナライザを呼び出していない</a></td><td>Bad practice</td></tr> |
| 87 <tr bgcolor="#ffffff"><td><a href="#FI_NULLIFY_SUPER">FI: ファイナライザはスーパークラスのファイナライ
ザを無効にしている</a></td><td>Bad practice</td></tr> |
| 88 <tr bgcolor="#eeeeee"><td><a href="#FI_USELESS">FI: ファイナライザはスーパークラスのファイナライザを呼び出し
ているだけ</a></td><td>Bad practice</td></tr> |
| 89 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_USES_NEWLINE">FS: 書式文字列は \n
よりも %n を使用するべき</a></td><td>Bad practice</td></tr> |
| 90 <tr bgcolor="#eeeeee"><td><a href="#GC_UNCHECKED_TYPE_IN_GENERIC_CALL">GC: 検査されな
い型への総称呼び出し</a></td><td>Bad practice</td></tr> |
| 91 <tr bgcolor="#ffffff"><td><a href="#HE_EQUALS_NO_HASHCODE">HE: equals メソッドは定義してい
ますが hashCode メソッドは定義していないクラス</a></td><td>Bad practice</td></tr> |
| 92 <tr bgcolor="#eeeeee"><td><a href="#HE_EQUALS_USE_HASHCODE">HE: equals メソッドを定義して
Object.hashCode() を使用しているクラス</a></td><td>Bad practice</td></tr> |
| 93 <tr bgcolor="#ffffff"><td><a href="#HE_HASHCODE_NO_EQUALS">HE: hashCode メソッドを定義し
ていますが equals メソッドは定義していないクラス</a></td><td>Bad practice</td></tr> |
| 94 <tr bgcolor="#eeeeee"><td><a href="#HE_HASHCODE_USE_OBJECT_EQUALS">HE: hashCode
メソッドを定義して Object.equals() を使用しているクラス</a></td><td>Bad practice</td></tr> |
| 95 <tr bgcolor="#ffffff"><td><a href="#HE_INHERITS_EQUALS_USE_HASHCODE">HE: equals
メソッドを継承して Object.hashCode() を使用しているクラス</a></td><td>Bad practice</td></tr> |
| 96 <tr bgcolor="#eeeeee"><td><a href="#IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZ
ATION">IC: スーパークラスは初期化中にサブクラスを使用している</a></td><td>Bad practice</td></tr> |
| 97 <tr bgcolor="#ffffff"><td><a href="#IMSE_DONT_CATCH_IMSE">IMSE: 疑わしい IllegalMoni
torStateException のキャッチ</a></td><td>Bad practice</td></tr> |
| 98 <tr bgcolor="#eeeeee"><td><a href="#ISC_INSTANTIATE_STATIC_CLASS">ISC: static メソ
ッドだけを提供するクラスの不必要なインスタンス化</a></td><td>Bad practice</td></tr> |
| 99 <tr bgcolor="#ffffff"><td><a href="#IT_NO_SUCH_ELEMENT">It: Iterator.next() が No
SuchElementException をスローできない</a></td><td>Bad practice</td></tr> |
| 100 <tr bgcolor="#eeeeee"><td><a href="#J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_S
ESSION">J2EE: HttpSession への非直列化可能オブジェクトの格納</a></td><td>Bad practice</td></tr> |
| 101 <tr bgcolor="#ffffff"><td><a href="#JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS">JC
IP: 不変クラスのフィールドは final にすべき</a></td><td>Bad practice</td></tr> |
| 102 <tr bgcolor="#eeeeee"><td><a href="#NP_BOOLEAN_RETURN_NULL">NP: 戻り型が Boolean のメソ
ッドが明示的に null を返している</a></td><td>Bad practice</td></tr> |
| 103 <tr bgcolor="#ffffff"><td><a href="#NP_CLONE_COULD_RETURN_NULL">NP: null を返すかもしれ
ない clone メソッド</a></td><td>Bad practice</td></tr> |
| 104 <tr bgcolor="#eeeeee"><td><a href="#NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT">NP: e
quals メソッドは null の引数をチェックしていない</a></td><td>Bad practice</td></tr> |
| 105 <tr bgcolor="#ffffff"><td><a href="#NP_TOSTRING_COULD_RETURN_NULL">NP: null を返すか
もしれない toString メソッド</a></td><td>Bad practice</td></tr> |
| 106 <tr bgcolor="#eeeeee"><td><a href="#NM_CLASS_NAMING_CONVENTION">Nm: クラス名は大文字から始め
るべき</a></td><td>Bad practice</td></tr> |
| 107 <tr bgcolor="#ffffff"><td><a href="#NM_CLASS_NOT_EXCEPTION">Nm: 例外クラスのように命名されている
が、クラスは Exception から派生されていない</a></td><td>Bad practice</td></tr> |
| 108 <tr bgcolor="#eeeeee"><td><a href="#NM_CONFUSING">Nm: 紛らわしい名前のメソッド</a></td><td>B
ad practice</td></tr> |
| 109 <tr bgcolor="#ffffff"><td><a href="#NM_FIELD_NAMING_CONVENTION">Nm: フィールド名は小文字から
始めるべき</a></td><td>Bad practice</td></tr> |
| 110 <tr bgcolor="#eeeeee"><td><a href="#NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER">Nm: Ja
va の後のバージョンのキーワードである識別子を使用している</a></td><td>Bad practice</td></tr> |
| 111 <tr bgcolor="#ffffff"><td><a href="#NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER"
>Nm: Java の後のバージョンのキーワードである識別子を使用している</a></td><td>Bad practice</td></tr> |
| 112 <tr bgcolor="#eeeeee"><td><a href="#NM_METHOD_NAMING_CONVENTION">Nm: メソッド名は小文字から
始めるべきです</a></td><td>Bad practice</td></tr> |
| 113 <tr bgcolor="#ffffff"><td><a href="#NM_SAME_SIMPLE_NAME_AS_INTERFACE">Nm: クラス名は実
装されたインタフェースの単純名を遮るべきではない</a></td><td>Bad practice</td></tr> |
| 114 <tr bgcolor="#eeeeee"><td><a href="#NM_SAME_SIMPLE_NAME_AS_SUPERCLASS">Nm: クラス名は
スーパークラスの単純名を遮るべきではない</a></td><td>Bad practice</td></tr> |
| 115 <tr bgcolor="#ffffff"><td><a href="#NM_VERY_CONFUSING_INTENTIONAL">Nm: 非常に紛らわしい名
前のメソッド (多分意図的)</a></td><td>Bad practice</td></tr> |
| 116 <tr bgcolor="#eeeeee"><td><a href="#NM_WRONG_PACKAGE_INTENTIONAL">Nm: パラメータの間違った
パッケージのためにスーパークラスのメソッドをオーバーライドしていないメソッド</a></td><td>Bad practice</td></tr> |
| 117 <tr bgcolor="#ffffff"><td><a href="#ODR_OPEN_DATABASE_RESOURCE">ODR: データベースリソースの
クローズに失敗するかもしれないメソッド</a></td><td>Bad practice</td></tr> |
| 118 <tr bgcolor="#eeeeee"><td><a href="#ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH">O
DR: 例外経路でデータベースリソースのクローズに失敗するかもしれないメソッド</a></td><td>Bad practice</td></tr> |
| 119 <tr bgcolor="#ffffff"><td><a href="#OS_OPEN_STREAM">OS: ストリームのクローズに失敗するかもしれないメソッ
ド</a></td><td>Bad practice</td></tr> |
| 120 <tr bgcolor="#eeeeee"><td><a href="#OS_OPEN_STREAM_EXCEPTION_PATH">OS: 例外経路でストリー
ムのクローズに失敗するかもしれないメソッド</a></td><td>Bad practice</td></tr> |
| 121 <tr bgcolor="#ffffff"><td><a href="#PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS">PZ
: 繰り返しでエントリオブジェクトを再利用しない</a></td><td>Bad practice</td></tr> |
| 122 <tr bgcolor="#eeeeee"><td><a href="#RC_REF_COMPARISON_BAD_PRACTICE">RC: 定数への疑わしい
参照比較</a></td><td>Bad practice</td></tr> |
| 123 <tr bgcolor="#ffffff"><td><a href="#RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN">RC:
Boolean 値の疑わしい参照比較</a></td><td>Bad practice</td></tr> |
| 124 <tr bgcolor="#eeeeee"><td><a href="#RR_NOT_CHECKED">RR: InputStream.read() の戻り値を
無視しているメソッド</a></td><td>Bad practice</td></tr> |
| 125 <tr bgcolor="#ffffff"><td><a href="#SR_NOT_CHECKED">RR: InputStream.skip() の戻り値を
無視しているメソッド</a></td><td>Bad practice</td></tr> |
| 126 <tr bgcolor="#eeeeee"><td><a href="#RV_NEGATING_RESULT_OF_COMPARETO">RV: compare
To()/compare() の結果を無効にする</a></td><td>Bad practice</td></tr> |
| 127 <tr bgcolor="#ffffff"><td><a href="#RV_RETURN_VALUE_IGNORED_BAD_PRACTICE">RV: 例外
的戻り値を無視しているメソッド</a></td><td>Bad practice</td></tr> |
| 128 <tr bgcolor="#eeeeee"><td><a href="#SI_INSTANCE_BEFORE_FINALS_ASSIGNED">SI: スタティ
ックイニシャライザは、すべての static final フィールドが代入される前にインスタンスを作成する</a></td><td>Bad practice</
td></tr> |
| 129 <tr bgcolor="#ffffff"><td><a href="#SW_SWING_METHODS_INVOKED_IN_SWING_THREAD">SW
: Swing メソッドは AWT イベントディスパッチスレッドから呼び出す必要がある</a></td><td>Bad practice</td></tr> |
| 130 <tr bgcolor="#eeeeee"><td><a href="#SE_BAD_FIELD">Se: 直列化可能クラスの非 transient で非直列化
可能なインスタンスフィールド</a></td><td>Bad practice</td></tr> |
| 131 <tr bgcolor="#ffffff"><td><a href="#SE_BAD_FIELD_INNER_CLASS">Se: 非直列化可能クラスに直列化可
能な内部クラスがある</a></td><td>Bad practice</td></tr> |
| 132 <tr bgcolor="#eeeeee"><td><a href="#SE_BAD_FIELD_STORE">Se: 非直列化可能な値を直列化可能クラスのイン
スタンスフィールドに格納している</a></td><td>Bad practice</td></tr> |
| 133 <tr bgcolor="#ffffff"><td><a href="#SE_COMPARATOR_SHOULD_BE_SERIALIZABLE">Se: Co
mparator は Serializable を実装していない</a></td><td>Bad practice</td></tr> |
| 134 <tr bgcolor="#eeeeee"><td><a href="#SE_INNER_CLASS">Se: 直列化可能な内部クラス</a></td><td>
Bad practice</td></tr> |
| 135 <tr bgcolor="#ffffff"><td><a href="#SE_NONFINAL_SERIALVERSIONID">Se: serialVersi
onUID が final ではない</a></td><td>Bad practice</td></tr> |
| 136 <tr bgcolor="#eeeeee"><td><a href="#SE_NONLONG_SERIALVERSIONID">Se: serialVersio
nUID が long ではない</a></td><td>Bad practice</td></tr> |
| 137 <tr bgcolor="#ffffff"><td><a href="#SE_NONSTATIC_SERIALVERSIONID">Se: serialVers
ionUID が static ではない</a></td><td>Bad practice</td></tr> |
| 138 <tr bgcolor="#eeeeee"><td><a href="#SE_NO_SUITABLE_CONSTRUCTOR">Se: Serializable
なクラスのスーパークラスで、引数なしコンストラクタを定義していない</a></td><td>Bad practice</td></tr> |
| 139 <tr bgcolor="#ffffff"><td><a href="#SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATI
ON">Se: Externalizable なクラスが引数なしコンストラクタを定義していない</a></td><td>Bad practice</td></t
r> |
| 140 <tr bgcolor="#eeeeee"><td><a href="#SE_READ_RESOLVE_MUST_RETURN_OBJECT">Se: read
Resolve メソッドの戻り値の型が Object で宣言されていない</a></td><td>Bad practice</td></tr> |
| 141 <tr bgcolor="#ffffff"><td><a href="#SE_TRANSIENT_FIELD_NOT_RESTORED">Se: 直列化復元によ
って設定されない transient フィールド </a></td><td>Bad practice</td></tr> |
| 142 <tr bgcolor="#eeeeee"><td><a href="#SE_NO_SERIALVERSIONID">SnVI: Serializable なク
ラスが serialVersionUID を定義していない</a></td><td>Bad practice</td></tr> |
| 143 <tr bgcolor="#ffffff"><td><a href="#UI_INHERITANCE_UNSAFE_GETRESOURCE">UI: クラスが拡
張されるなら getResource の使い方は安全ではないかもしれない</a></td><td>Bad practice</td></tr> |
| 144 <tr bgcolor="#eeeeee"><td><a href="#BC_IMPOSSIBLE_CAST">BC: 不可能なキャスト</a></td><td
>Correctness</td></tr> |
| 145 <tr bgcolor="#ffffff"><td><a href="#BC_IMPOSSIBLE_DOWNCAST">BC: 不可能なダウンキャスト</a><
/td><td>Correctness</td></tr> |
| 146 <tr bgcolor="#eeeeee"><td><a href="#BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY">BC: toArr
ay メソッドの結果の不可能なダウンキャスト</a></td><td>Correctness</td></tr> |
| 147 <tr bgcolor="#ffffff"><td><a href="#BC_IMPOSSIBLE_INSTANCEOF">BC: 常に false を返す i
nstanceof</a></td><td>Correctness</td></tr> |
| 148 <tr bgcolor="#eeeeee"><td><a href="#BIT_ADD_OF_SIGNED_BYTE">BIT: 符号付きバイト値のビット加算<
/a></td><td>Correctness</td></tr> |
| 149 <tr bgcolor="#ffffff"><td><a href="#BIT_AND">BIT: 互換性のないビットマスク</a></td><td>Corre
ctness</td></tr> |
| 150 <tr bgcolor="#eeeeee"><td><a href="#BIT_AND_ZZ">BIT: ((...) & 0) == 0 なのか確かめている<
/a></td><td>Correctness</td></tr> |
| 151 <tr bgcolor="#ffffff"><td><a href="#BIT_IOR">BIT: 互換性のないビットマスク</a></td><td>Corre
ctness</td></tr> |
| 152 <tr bgcolor="#eeeeee"><td><a href="#BIT_IOR_OF_SIGNED_BYTE">BIT: 符号付きバイト値のビット論理和
</a></td><td>Correctness</td></tr> |
| 153 <tr bgcolor="#ffffff"><td><a href="#BIT_SIGNED_CHECK_HIGH_BIT">BIT: ビット演算の符号をチェッ
クする</a></td><td>Correctness</td></tr> |
| 154 <tr bgcolor="#eeeeee"><td><a href="#BOA_BADLY_OVERRIDDEN_ADAPTER">BOA: スーパークラスの
Adapter で実装されるメソッドを誤ってオーバーライドしているクラス</a></td><td>Correctness</td></tr> |
| 155 <tr bgcolor="#ffffff"><td><a href="#ICAST_BAD_SHIFT_AMOUNT">BSHIFT: 32ビット int の-
31から31の範囲を超えた量によるシフト</a></td><td>Correctness</td></tr> |
| 156 <tr bgcolor="#eeeeee"><td><a href="#BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR"
>Bx: プリミティブ値が3項演算子のためにアンボクシングされて、型変換される</a></td><td>Correctness</td></tr> |
| 157 <tr bgcolor="#ffffff"><td><a href="#CO_COMPARETO_RESULTS_MIN_VALUE">Co: compareT
o()/compare() は Integer.MIN_VALUE を返す</a></td><td>Correctness</td></tr> |
| 158 <tr bgcolor="#eeeeee"><td><a href="#DLS_DEAD_LOCAL_INCREMENT_IN_RETURN">DLS: ret
urn 文に役に立たないインクリメントがある</a></td><td>Correctness</td></tr> |
| 159 <tr bgcolor="#ffffff"><td><a href="#DLS_DEAD_STORE_OF_CLASS_LITERAL">DLS: クラスリテラ
ルの無効な代入</a></td><td>Correctness</td></tr> |
| 160 <tr bgcolor="#eeeeee"><td><a href="#DLS_OVERWRITTEN_INCREMENT">DLS: 上書きされたインクリメン
ト</a></td><td>Correctness</td></tr> |
| 161 <tr bgcolor="#ffffff"><td><a href="#DMI_ARGUMENTS_WRONG_ORDER">DMI: 逆にされた引数</a><
/td><td>Correctness</td></tr> |
| 162 <tr bgcolor="#eeeeee"><td><a href="#DMI_BAD_MONTH">DMI: 月のための間違った定数値</a></td><td
>Correctness</td></tr> |
| 163 <tr bgcolor="#ffffff"><td><a href="#DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE">DMI:
正確に表されない double から構築された BigDecimal</a></td><td>Correctness</td></tr> |
| 164 <tr bgcolor="#eeeeee"><td><a href="#DMI_CALLING_NEXT_FROM_HASNEXT">DMI: hasNext
メソッドで next メソッドを呼び出している</a></td><td>Correctness</td></tr> |
| 165 <tr bgcolor="#ffffff"><td><a href="#DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVE
S">DMI: コレクションは自分自身を含めるべきではない</a></td><td>Correctness</td></tr> |
| 166 <tr bgcolor="#eeeeee"><td><a href="#DMI_DOH">DMI: D'oh! 無意味なメソッド呼び出し</a></td><td
>Correctness</td></tr> |
| 167 <tr bgcolor="#ffffff"><td><a href="#DMI_INVOKING_HASHCODE_ON_ARRAY">DMI: 配列で has
hCode メソッドを呼び出している</a></td><td>Correctness</td></tr> |
| 168 <tr bgcolor="#eeeeee"><td><a href="#DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT">DMI:
int に対して Double.longBitsToDouble() を呼び出している</a></td><td>Correctness</td></tr> |
| 169 <tr bgcolor="#ffffff"><td><a href="#DMI_VACUOUS_SELF_COLLECTION_CALL">DMI: コレクショ
ンへの無意味な呼び出し</a></td><td>Correctness</td></tr> |
| 170 <tr bgcolor="#eeeeee"><td><a href="#DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION"
>Dm: ランタイムリテンションなしで、アノテーションの存在を調べるためにリフレクションを使用することはできない</a></td><td>Correctness
</td></tr> |
| 171 <tr bgcolor="#ffffff"><td><a href="#DMI_FUTILE_ATTEMPT_TO_CHANGE_MAXPOOL_SIZE_OF
_SCHEDULED_THREAD_POOL_EXECUTOR">Dm: ScheduledThreadPoolExecutor の最大プールサイズを変えようと
する無駄な試み</a></td><td>Correctness</td></tr> |
| 172 <tr bgcolor="#eeeeee"><td><a href="#DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH_ZERO
_CORE_THREADS">Dm: コアプールサイズが0の ScheduledThreadPoolExecutor の作成</a></td><td>Corre
ctness</td></tr> |
| 173 <tr bgcolor="#ffffff"><td><a href="#DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD">Dm: Eas
yMock メソッドへの役に立たない/無意味な呼び出し</a></td><td>Correctness</td></tr> |
| 174 <tr bgcolor="#eeeeee"><td><a href="#EC_ARRAY_AND_NONARRAY">EC: equals メソッドを使用して配
列と非配列を比較している</a></td><td>Correctness</td></tr> |
| 175 <tr bgcolor="#ffffff"><td><a href="#EC_BAD_ARRAY_COMPARE">EC: 配列の equals メソッド呼び出
しは == と等価である</a></td><td>Correctness</td></tr> |
| 176 <tr bgcolor="#eeeeee"><td><a href="#EC_INCOMPATIBLE_ARRAY_COMPARE">EC: equals(..
.) メソッドを使用して互換性のない配列を比較している</a></td><td>Correctness</td></tr> |
| 177 <tr bgcolor="#ffffff"><td><a href="#EC_NULL_ARG">EC: equals(null) の呼び出し</a></td>
<td>Correctness</td></tr> |
| 178 <tr bgcolor="#eeeeee"><td><a href="#EC_UNRELATED_CLASS_AND_INTERFACE">EC: equals
メソッドを呼び出して無関係のクラスとインタフェースを比較している</a></td><td>Correctness</td></tr> |
| 179 <tr bgcolor="#ffffff"><td><a href="#EC_UNRELATED_INTERFACES">EC: equals メソッドを呼び出
して異なる型のインタフェースを比較している</a></td><td>Correctness</td></tr> |
| 180 <tr bgcolor="#eeeeee"><td><a href="#EC_UNRELATED_TYPES">EC: equals メソッドを呼び出して異なる
型を比較している</a></td><td>Correctness</td></tr> |
| 181 <tr bgcolor="#ffffff"><td><a href="#EC_UNRELATED_TYPES_USING_POINTER_EQUALITY">E
C: 参照等価性を使用して異なる型を比較している</a></td><td>Correctness</td></tr> |
| 182 <tr bgcolor="#eeeeee"><td><a href="#EQ_ALWAYS_FALSE">Eq: equals メソッドは常に false を戻
す</a></td><td>Correctness</td></tr> |
| 183 <tr bgcolor="#ffffff"><td><a href="#EQ_ALWAYS_TRUE">Eq: equals メソッドは常に true を返す<
/a></td><td>Correctness</td></tr> |
| 184 <tr bgcolor="#eeeeee"><td><a href="#EQ_COMPARING_CLASS_NAMES">Eq: equals メソッドはクラ
スオブジェクトではなくクラス名を比較している</a></td><td>Correctness</td></tr> |
| 185 <tr bgcolor="#ffffff"><td><a href="#EQ_DONT_DEFINE_EQUALS_FOR_ENUM">Eq: 列挙型は共変な
equals メソッドを定義している</a></td><td>Correctness</td></tr> |
| 186 <tr bgcolor="#eeeeee"><td><a href="#EQ_OTHER_NO_OBJECT">Eq: equals(Object) メソッドを
オーバーライドしていない equals メソッドの定義</a></td><td>Correctness</td></tr> |
| 187 <tr bgcolor="#ffffff"><td><a href="#EQ_OTHER_USE_OBJECT">Eq: Object.equals(Objec
t) をオーバーライドしていない equals メソッドの定義</a></td><td>Correctness</td></tr> |
| 188 <tr bgcolor="#eeeeee"><td><a href="#EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC">Eq: equa
ls メソッドはスーパークラスの equals メソッドをオーバーライドしているが、対称的ではないかもしれない</a></td><td>Correctness<
/td></tr> |
| 189 <tr bgcolor="#ffffff"><td><a href="#EQ_SELF_USE_OBJECT">Eq: 共変な equals メソッドを定義して
、Object.equals(Object) を継承している</a></td><td>Correctness</td></tr> |
| 190 <tr bgcolor="#eeeeee"><td><a href="#FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER">FE: NaN への
等価性のための絶望的なテスト</a></td><td>Correctness</td></tr> |
| 191 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_BAD_ARGUMENT">FS: 書式指示子へ渡して
いる引数に互換性がない</a></td><td>Correctness</td></tr> |
| 192 <tr bgcolor="#eeeeee"><td><a href="#VA_FORMAT_STRING_BAD_CONVERSION">FS: 与えられた引数
の型は書式指示子に合致しません</a></td><td>Correctness</td></tr> |
| 193 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUP
PLIED">FS: printf スタイルの書式が期待されているところで MessageFormat が与えられている</a></td><td>Correct
ness</td></tr> |
| 194 <tr bgcolor="#eeeeee"><td><a href="#VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED">FS:
書式文字列で実際に使われるより、多くの引数が渡されている</a></td><td>Correctness</td></tr> |
| 195 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_ILLEGAL">FS: 無効な書式文字列</a></
td><td>Correctness</td></tr> |
| 196 <tr bgcolor="#eeeeee"><td><a href="#VA_FORMAT_STRING_MISSING_ARGUMENT">FS: 書式文字列
は足りない引数を参照している</a></td><td>Correctness</td></tr> |
| 197 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT">FS: 書
式文字列ための前の引数がない</a></td><td>Correctness</td></tr> |
| 198 <tr bgcolor="#eeeeee"><td><a href="#GC_UNRELATED_TYPES">GC: 型パラメータとメソッド引数に関係がない<
/a></td><td>Correctness</td></tr> |
| 199 <tr bgcolor="#ffffff"><td><a href="#HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_
CLASS">HE: ハッシュ化された文脈でハッシュ化できないクラスの使用がシグネチャで宣言されている</a></td><td>Correctness</td>
</tr> |
| 200 <tr bgcolor="#eeeeee"><td><a href="#HE_USE_OF_UNHASHABLE_CLASS">HE: ハッシュデータ構造で h
ashCode メソッドのないクラスを使用している</a></td><td>Correctness</td></tr> |
| 201 <tr bgcolor="#ffffff"><td><a href="#ICAST_INT_2_LONG_AS_INSTANT">ICAST: int 値を l
ong に変換して絶対時間として使用している</a></td><td>Correctness</td></tr> |
| 202 <tr bgcolor="#eeeeee"><td><a href="#ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL">ICA
ST: 整数値を double にキャストして Math.ceil() に渡している</a></td><td>Correctness</td></tr> |
| 203 <tr bgcolor="#ffffff"><td><a href="#ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND">ICA
ST: 整数値を float にキャストして Math.round() に渡している</a></td><td>Correctness</td></tr> |
| 204 <tr bgcolor="#eeeeee"><td><a href="#IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD">I
JU: run メソッドでの JUnit アサーションは JUnit によって通知されない</a></td><td>Correctness</td></tr> |
| 205 <tr bgcolor="#ffffff"><td><a href="#IJU_BAD_SUITE_METHOD">IJU: TestCase は suite
メソッドの間違った宣言をしている</a></td><td>Correctness</td></tr> |
| 206 <tr bgcolor="#eeeeee"><td><a href="#IJU_NO_TESTS">IJU: TestCase はテストがない </a></td
><td>Correctness</td></tr> |
| 207 <tr bgcolor="#ffffff"><td><a href="#IJU_SETUP_NO_SUPER">IJU: TestCase は super.se
tup() を呼び出さない setUp メソッドを実装している</a></td><td>Correctness</td></tr> |
| 208 <tr bgcolor="#eeeeee"><td><a href="#IJU_SUITE_NOT_STATIC">IJU: TestCase は 非 stat
ic な suite メソッドを実装している</a></td><td>Correctness</td></tr> |
| 209 <tr bgcolor="#ffffff"><td><a href="#IJU_TEARDOWN_NO_SUPER">IJU: TestCase は super
.tearDown() を呼び出さない tearDown メソッドを実装している </a></td><td>Correctness</td></tr> |
| 210 <tr bgcolor="#eeeeee"><td><a href="#IL_CONTAINER_ADDED_TO_ITSELF">IL: コレクションは自分自
身を追加している</a></td><td>Correctness</td></tr> |
| 211 <tr bgcolor="#ffffff"><td><a href="#IL_INFINITE_LOOP">IL: 明らかな無限ループ</a></td><td>
Correctness</td></tr> |
| 212 <tr bgcolor="#eeeeee"><td><a href="#IL_INFINITE_RECURSIVE_LOOP">IL: 明らかな無限再帰ループ<
/a></td><td>Correctness</td></tr> |
| 213 <tr bgcolor="#ffffff"><td><a href="#IM_MULTIPLYING_RESULT_OF_IREM">IM: 整数剰余の結果の整
数乗算</a></td><td>Correctness</td></tr> |
| 214 <tr bgcolor="#eeeeee"><td><a href="#INT_BAD_COMPARISON_WITH_INT_VALUE">INT: int
値と long 定数との間違った比較</a></td><td>Correctness</td></tr> |
| 215 <tr bgcolor="#ffffff"><td><a href="#INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE">I
NT: 負でない値と負の定数との間違った比較</a></td><td>Correctness</td></tr> |
| 216 <tr bgcolor="#eeeeee"><td><a href="#INT_BAD_COMPARISON_WITH_SIGNED_BYTE">INT: 符号
付きバイトの間違った比較</a></td><td>Correctness</td></tr> |
| 217 <tr bgcolor="#ffffff"><td><a href="#IO_APPENDING_TO_OBJECT_OUTPUT_STREAM">IO: オブ
ジェクト出力ストリームへの追加は失敗に終わる</a></td><td>Correctness</td></tr> |
| 218 <tr bgcolor="#eeeeee"><td><a href="#IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN">IP: メソ
ッドで読み取られずに上書きされているパラメータ</a></td><td>Correctness</td></tr> |
| 219 <tr bgcolor="#ffffff"><td><a href="#MF_CLASS_MASKS_FIELD">MF: スーパークラスのフィールドを隠すフィ
ールドを定義しているクラス</a></td><td>Correctness</td></tr> |
| 220 <tr bgcolor="#eeeeee"><td><a href="#MF_METHOD_MASKS_FIELD">MF: フィールドを隠す変数を定義している
メソッド</a></td><td>Correctness</td></tr> |
| 221 <tr bgcolor="#ffffff"><td><a href="#NP_ALWAYS_NULL">NP: null 値を利用している</a></td><t
d>Correctness</td></tr> |
| 222 <tr bgcolor="#eeeeee"><td><a href="#NP_ALWAYS_NULL_EXCEPTION">NP: null 値を例外経路で利用
している</a></td><td>Correctness</td></tr> |
| 223 <tr bgcolor="#ffffff"><td><a href="#NP_ARGUMENT_MIGHT_BE_NULL">NP: null の引数をチェック
していないメソッド</a></td><td>Correctness</td></tr> |
| 224 <tr bgcolor="#eeeeee"><td><a href="#NP_CLOSING_NULL">NP: 常に null 値のオブジェクトで close
メソッドを呼び出している</a></td><td>Correctness</td></tr> |
| 225 <tr bgcolor="#ffffff"><td><a href="#NP_GUARANTEED_DEREF">NP: null 値を利用することが保証されて
いる</a></td><td>Correctness</td></tr> |
| 226 <tr bgcolor="#eeeeee"><td><a href="#NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH">NP: n
ull 値を例外経路で利用することが保証されている</a></td><td>Correctness</td></tr> |
| 227 <tr bgcolor="#ffffff"><td><a href="#NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUC
TOR">NP: 非 null フィールドは初期化されていない</a></td><td>Correctness</td></tr> |
| 228 <tr bgcolor="#eeeeee"><td><a href="#NP_NONNULL_PARAM_VIOLATION">NP: メソッド呼び出しは非 n
ull パラメータに対して null を渡している</a></td><td>Correctness</td></tr> |
| 229 <tr bgcolor="#ffffff"><td><a href="#NP_NONNULL_RETURN_VIOLATION">NP: null を返すかもし
れないメソッドが @NonNull 宣言されている</a></td><td>Correctness</td></tr> |
| 230 <tr bgcolor="#eeeeee"><td><a href="#NP_NULL_INSTANCEOF">NP: null とわかっている値をその型のイン
スタンスなのか確かめている</a></td><td>Correctness</td></tr> |
| 231 <tr bgcolor="#ffffff"><td><a href="#NP_NULL_ON_SOME_PATH">NP: null 値を利用している可能性があ
る</a></td><td>Correctness</td></tr> |
| 232 <tr bgcolor="#eeeeee"><td><a href="#NP_NULL_ON_SOME_PATH_EXCEPTION">NP: null 値を例
外経路で利用している可能性がある</a></td><td>Correctness</td></tr> |
| 233 <tr bgcolor="#ffffff"><td><a href="#NP_NULL_PARAM_DEREF">NP: メソッド呼び出しは非 null パラメ
ータに対して null を渡している</a></td><td>Correctness</td></tr> |
| 234 <tr bgcolor="#eeeeee"><td><a href="#NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS">N
P: メソッド呼び出しは非 null パラメータに対して null を渡している</a></td><td>Correctness</td></tr> |
| 235 <tr bgcolor="#ffffff"><td><a href="#NP_NULL_PARAM_DEREF_NONVIRTUAL">NP: 非 null パ
ラメータに null を渡している非仮想メソッドの呼び出し</a></td><td>Correctness</td></tr> |
| 236 <tr bgcolor="#eeeeee"><td><a href="#NP_OPTIONAL_RETURN_NULL">NP: Optional の戻り型を持
つメソッドが明示的に null を返す</a></td><td>Correctness</td></tr> |
| 237 <tr bgcolor="#ffffff"><td><a href="#NP_STORE_INTO_NONNULL_FIELD">NP: @NonNull でア
ノテートされたフィールドに null を格納している</a></td><td>Correctness</td></tr> |
| 238 <tr bgcolor="#eeeeee"><td><a href="#NP_UNWRITTEN_FIELD">NP: 書き込まれていないフィールドの読み出し<
/a></td><td>Correctness</td></tr> |
| 239 <tr bgcolor="#ffffff"><td><a href="#NM_BAD_EQUAL">Nm: クラスは equal(Object) を定義していま
す。equals(Object) にすべきですか?</a></td><td>Correctness</td></tr> |
| 240 <tr bgcolor="#eeeeee"><td><a href="#NM_LCASE_HASHCODE">Nm: クラスは hashcode() を定義して
います。hashCode() にすべきですか?</a></td><td>Correctness</td></tr> |
| 241 <tr bgcolor="#ffffff"><td><a href="#NM_LCASE_TOSTRING">Nm: クラスは tostring() を定義して
います。toString() にすべきですか?</a></td><td>Correctness</td></tr> |
| 242 <tr bgcolor="#eeeeee"><td><a href="#NM_METHOD_CONSTRUCTOR_CONFUSION">Nm: 明らかなメソッ
ドとコンストラクタの混乱</a></td><td>Correctness</td></tr> |
| 243 <tr bgcolor="#ffffff"><td><a href="#NM_VERY_CONFUSING">Nm: 非常に紛らわしい名前のメソッド</a></
td><td>Correctness</td></tr> |
| 244 <tr bgcolor="#eeeeee"><td><a href="#NM_WRONG_PACKAGE">Nm: パラメータの間違ったパッケージのために、スー
パークラスのメソッドをオーバーライドしていないメソッド</a></td><td>Correctness</td></tr> |
| 245 <tr bgcolor="#ffffff"><td><a href="#QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT">QBA: 論理
式で boolean リテラル値を代入しているメソッド</a></td><td>Correctness</td></tr> |
| 246 <tr bgcolor="#eeeeee"><td><a href="#RC_REF_COMPARISON">RC: 疑わしい参照比較</a></td><td>
Correctness</td></tr> |
| 247 <tr bgcolor="#ffffff"><td><a href="#RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NP
E">RCN: すでに利用していた値の null チェック</a></td><td>Correctness</td></tr> |
| 248 <tr bgcolor="#eeeeee"><td><a href="#RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION">RE: 正規
表現のための無効な構文</a></td><td>Correctness</td></tr> |
| 249 <tr bgcolor="#ffffff"><td><a href="#RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRES
SION">RE: 正規表現のために使われている File.separator</a></td><td>Correctness</td></tr> |
| 250 <tr bgcolor="#eeeeee"><td><a href="#RE_POSSIBLE_UNINTENDED_PATTERN">RE: 正規表現のために
使われている "." または "|"</a></td><td>Correctness</td></tr> |
| 251 <tr bgcolor="#ffffff"><td><a href="#RV_01_TO_INT">RV: 0から1の乱数値は整数値0に丸められる</a></t
d><td>Correctness</td></tr> |
| 252 <tr bgcolor="#eeeeee"><td><a href="#RV_ABSOLUTE_VALUE_OF_HASHCODE">RV: 符号付き32ビット
ハッシュコードの絶対値を計算する間違った試み</a></td><td>Correctness</td></tr> |
| 253 <tr bgcolor="#ffffff"><td><a href="#RV_ABSOLUTE_VALUE_OF_RANDOM_INT">RV: 符号付き整数の
乱数の絶対値を計算する間違った試み</a></td><td>Correctness</td></tr> |
| 254 <tr bgcolor="#eeeeee"><td><a href="#RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE
">RV: compareTo によって返された特定の値のコードチェック</a></td><td>Correctness</td></tr> |
| 255 <tr bgcolor="#ffffff"><td><a href="#RV_EXCEPTION_NOT_THROWN">RV: 作成した例外をスローするのでは
なく捨てている</a></td><td>Correctness</td></tr> |
| 256 <tr bgcolor="#eeeeee"><td><a href="#RV_RETURN_VALUE_IGNORED">RV: 戻り値を無視しているメソッド<
/a></td><td>Correctness</td></tr> |
| 257 <tr bgcolor="#ffffff"><td><a href="#RpC_REPEATED_CONDITIONAL_TEST">RpC: 条件テストの繰り
返し</a></td><td>Correctness</td></tr> |
| 258 <tr bgcolor="#eeeeee"><td><a href="#SA_FIELD_SELF_ASSIGNMENT">SA: フィールドの自己代入</a>
</td><td>Correctness</td></tr> |
| 259 <tr bgcolor="#ffffff"><td><a href="#SA_FIELD_SELF_COMPARISON">SA: フィールドとそれ自身との自己
比較</a></td><td>Correctness</td></tr> |
| 260 <tr bgcolor="#eeeeee"><td><a href="#SA_FIELD_SELF_COMPUTATION">SA: フィールドの無意味な自己演
算 (たとえば、 x & x)</a></td><td>Correctness</td></tr> |
| 261 <tr bgcolor="#ffffff"><td><a href="#SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD">S
A: フィールドへの代入ではなくローカル変数への自己代入</a></td><td>Correctness</td></tr> |
| 262 <tr bgcolor="#eeeeee"><td><a href="#SA_LOCAL_SELF_COMPARISON">SA: ローカル変数とそれ自身との自
己比較</a></td><td>Correctness</td></tr> |
| 263 <tr bgcolor="#ffffff"><td><a href="#SA_LOCAL_SELF_COMPUTATION">SA: 変数の無意味な自己演算 (
たとえば、x & x)</a></td><td>Correctness</td></tr> |
| 264 <tr bgcolor="#eeeeee"><td><a href="#SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH">SF:
switch 文のフォールスルーのために格納が無効になっている</a></td><td>Correctness</td></tr> |
| 265 <tr bgcolor="#ffffff"><td><a href="#SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_T
HROW">SF: スローする switch 文のフォールスルーのために格納が無効になっている</a></td><td>Correctness</td></tr
> |
| 266 <tr bgcolor="#eeeeee"><td><a href="#SIC_THREADLOCAL_DEADLY_EMBRACE">SIC: 非 stati
c 内部クラスとスレッドローカルのデッドロック</a></td><td>Correctness</td></tr> |
| 267 <tr bgcolor="#ffffff"><td><a href="#SIO_SUPERFLUOUS_INSTANCEOF">SIO: instanceof
演算子を使用した不必要な型チェック</a></td><td>Correctness</td></tr> |
| 268 <tr bgcolor="#eeeeee"><td><a href="#SQL_BAD_PREPARED_STATEMENT_ACCESS">SQL: インデッ
クスが0で PreparedStatement にアクセスしようとしているメソッド</a></td><td>Correctness</td></tr> |
| 269 <tr bgcolor="#ffffff"><td><a href="#SQL_BAD_RESULTSET_ACCESS">SQL: インデックスが0で Res
ultSet にアクセスしようとしているメソッド</a></td><td>Correctness</td></tr> |
| 270 <tr bgcolor="#eeeeee"><td><a href="#STI_INTERRUPTED_ON_CURRENTTHREAD">STI: inter
rupted メソッドを呼び出すために不要な currentThread メソッドを呼び出している</a></td><td>Correctness</td></
tr> |
| 271 <tr bgcolor="#ffffff"><td><a href="#STI_INTERRUPTED_ON_UNKNOWNTHREAD">STI: スレッドイ
ンスタンスで static Thread.interrupted() を呼び出している</a></td><td>Correctness</td></tr> |
| 272 <tr bgcolor="#eeeeee"><td><a href="#SE_METHOD_MUST_BE_PRIVATE">Se: 直列化機構のために pri
vate にしなければならないメソッド</a></td><td>Correctness</td></tr> |
| 273 <tr bgcolor="#ffffff"><td><a href="#SE_READ_RESOLVE_IS_STATIC">Se: readResolve メ
ソッドが static メソッドとして宣言されている</a></td><td>Correctness</td></tr> |
| 274 <tr bgcolor="#eeeeee"><td><a href="#TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED">T
Q: 型修飾子でアノテーションされた値がその修飾子を付けてはならない値を必要とする場所で使われている</a></td><td>Correctness</td><
/tr> |
| 275 <tr bgcolor="#ffffff"><td><a href="#TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_Q
UALIFIERS">TQ: 互換性のない型修飾子による比較値</a></td><td>Correctness</td></tr> |
| 276 <tr bgcolor="#eeeeee"><td><a href="#TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK">T
Q: 型修飾子を付けていないかもしれない値がその型修飾子を必要とする方法で常に使われている</a></td><td>Correctness</td></tr> |
| 277 <tr bgcolor="#ffffff"><td><a href="#TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK">TQ
: 型修飾子を付けているかもしれない値がその型修飾子を禁止する方法で常に使われている</a></td><td>Correctness</td></tr> |
| 278 <tr bgcolor="#eeeeee"><td><a href="#TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED">T
Q: 型修飾子でアノテートされていない値がその修飾子が付けられた値を必要とする場所で使われている</a></td><td>Correctness</td></t
r> |
| 279 <tr bgcolor="#ffffff"><td><a href="#TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_
REQUIRED">TQ: 型修飾子がない値が修飾子を必要とする場所で使われている</a></td><td>Correctness</td></tr> |
| 280 <tr bgcolor="#eeeeee"><td><a href="#UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS">U
MAC: 呼び出し不可能なメソッドが無名クラスで定義されている</a></td><td>Correctness</td></tr> |
| 281 <tr bgcolor="#ffffff"><td><a href="#UR_UNINIT_READ">UR: コンストラクタで初期化されていないフィールドを読
み出している</a></td><td>Correctness</td></tr> |
| 282 <tr bgcolor="#eeeeee"><td><a href="#UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR
">UR: スーパークラスのコンストラクタから呼び出されるメソッドで初期化されていないフィールドを読み出している</a></td><td>Correctness
</td></tr> |
| 283 <tr bgcolor="#ffffff"><td><a href="#DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY">US
ELESS_STRING: 名前のない配列で toString メソッドを呼び出している</a></td><td>Correctness</td></tr> |
| 284 <tr bgcolor="#eeeeee"><td><a href="#DMI_INVOKING_TOSTRING_ON_ARRAY">USELESS_STRI
NG: 配列で toString メソッドを呼び出している</a></td><td>Correctness</td></tr> |
| 285 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY">
USELESS_STRING: 書式文字列を使用して役に立たない方法で配列をフォーマットしている</a></td><td>Correctness</td></t
r> |
| 286 <tr bgcolor="#eeeeee"><td><a href="#UWF_NULL_FIELD">UwF: null に設定されるだけのフィールド</a>
</td><td>Correctness</td></tr> |
| 287 <tr bgcolor="#ffffff"><td><a href="#UWF_UNWRITTEN_FIELD">UwF: 書き込まれていないフィールド</a>
</td><td>Correctness</td></tr> |
| 288 <tr bgcolor="#eeeeee"><td><a href="#VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG">
VA: 可変長引数を期待しているメソッドにプリミティブ型の配列を渡している</a></td><td>Correctness</td></tr> |
| 289 <tr bgcolor="#ffffff"><td><a href="#LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE">LG: ロガ
ーの変更は OpenJDK の弱参照が原因で潜在的に失われる</a></td><td>Experimental</td></tr> |
| 290 <tr bgcolor="#eeeeee"><td><a href="#OBL_UNSATISFIED_OBLIGATION">OBL: ストリームやリソースの
クリーンアップに失敗するかもしれないメソッド</a></td><td>Experimental</td></tr> |
| 291 <tr bgcolor="#ffffff"><td><a href="#OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE">O
BL: チェック例外でストリームやリソースのクリーンアップに失敗するかもしれないメソッド</a></td><td>Experimental</td></tr> |
| 292 <tr bgcolor="#eeeeee"><td><a href="#DM_CONVERT_CASE">Dm: 呼び出したメソッドの Locale パラメータ
の使用を検討する</a></td><td>Internationalization</td></tr> |
| 293 <tr bgcolor="#ffffff"><td><a href="#DM_DEFAULT_ENCODING">Dm: デフォルトエンコーディングへの依存</
a></td><td>Internationalization</td></tr> |
| 294 <tr bgcolor="#eeeeee"><td><a href="#DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED">
DP: doPrivileged ブロック内で作成されるべきクラスローダ</a></td><td>Malicious code vulnerability</t
d></tr> |
| 295 <tr bgcolor="#ffffff"><td><a href="#DP_DO_INSIDE_DO_PRIVILEGED">DP: doPrivileged
ブロック内で呼び出すべきメソッド</a></td><td>Malicious code vulnerability</td></tr> |
| 296 <tr bgcolor="#eeeeee"><td><a href="#EI_EXPOSE_REP">EI: 可変オブジェクトへの参照を返すことによって内部表現
を暴露するかもしれないメソッド</a></td><td>Malicious code vulnerability</td></tr> |
| 297 <tr bgcolor="#ffffff"><td><a href="#EI_EXPOSE_REP2">EI2: 可変オブジェクトへの参照を取り込むことによって
内部表現を暴露するかもしれないメソッド</a></td><td>Malicious code vulnerability</td></tr> |
| 298 <tr bgcolor="#eeeeee"><td><a href="#FI_PUBLIC_SHOULD_BE_PROTECTED">FI: ファイナライザは
public ではなく protected にすべき</a></td><td>Malicious code vulnerability</td></tr> |
| 299 <tr bgcolor="#ffffff"><td><a href="#EI_EXPOSE_STATIC_REP2">MS: static フィールドに可変オブ
ジェクトを格納することによって、内部の静的状態を暴露するかもしれないメソッド</a></td><td>Malicious code vulnerability<
/td></tr> |
| 300 <tr bgcolor="#eeeeee"><td><a href="#MS_CANNOT_BE_FINAL">MS: final でないフィールドは悪質なコー
ドから保護できない</a></td><td>Malicious code vulnerability</td></tr> |
| 301 <tr bgcolor="#ffffff"><td><a href="#MS_EXPOSE_REP">MS: 配列を返すことによって内部表現を暴露するかもしれな
い public static メソッド</a></td><td>Malicious code vulnerability</td></tr> |
| 302 <tr bgcolor="#eeeeee"><td><a href="#MS_FINAL_PKGPROTECT">MS: final かつパッケージプロテクテッ
ドにすべきフィールド</a></td><td>Malicious code vulnerability</td></tr> |
| 303 <tr bgcolor="#ffffff"><td><a href="#MS_MUTABLE_ARRAY">MS: 可変配列のフィールド</a></td><td
>Malicious code vulnerability</td></tr> |
| 304 <tr bgcolor="#eeeeee"><td><a href="#MS_MUTABLE_HASHTABLE">MS: 可変 Hashtable のフィール
ド</a></td><td>Malicious code vulnerability</td></tr> |
| 305 <tr bgcolor="#ffffff"><td><a href="#MS_OOI_PKGPROTECT">MS: インタフェースから移動してパッケージプロテ
クテッドにすべきフィールド</a></td><td>Malicious code vulnerability</td></tr> |
| 306 <tr bgcolor="#eeeeee"><td><a href="#MS_PKGPROTECT">MS: パッケージプロテクテッドにすべきフィールド</a>
</td><td>Malicious code vulnerability</td></tr> |
| 307 <tr bgcolor="#ffffff"><td><a href="#MS_SHOULD_BE_FINAL">MS: final にすべきフィールド</a><
/td><td>Malicious code vulnerability</td></tr> |
| 308 <tr bgcolor="#eeeeee"><td><a href="#MS_SHOULD_BE_REFACTORED_TO_BE_FINAL">MS: fin
al でないフィールドはリファクタリングするべき</a></td><td>Malicious code vulnerability</td></tr> |
| 309 <tr bgcolor="#ffffff"><td><a href="#AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACT
ION">AT: 並行抽象の呼び出しシーケンスはアトミックではないかもしれない</a></td><td>Multithreaded correctness</t
d></tr> |
| 310 <tr bgcolor="#eeeeee"><td><a href="#DC_DOUBLECHECK">DC: フィールドのダブルチェックの可能性</a></t
d><td>Multithreaded correctness</td></tr> |
| 311 <tr bgcolor="#ffffff"><td><a href="#DL_SYNCHRONIZATION_ON_BOOLEAN">DL: Boolean の
同期化</a></td><td>Multithreaded correctness</td></tr> |
| 312 <tr bgcolor="#eeeeee"><td><a href="#DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE">DL: デ
ッドロックの原因になる可能性があるボクシングされたプリミティブ型の同期化</a></td><td>Multithreaded correctness</td><
/tr> |
| 313 <tr bgcolor="#ffffff"><td><a href="#DL_SYNCHRONIZATION_ON_SHARED_CONSTANT">DL: 正
準化した文字列の同期化</a></td><td>Multithreaded correctness</td></tr> |
| 314 <tr bgcolor="#eeeeee"><td><a href="#DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITI
VE">DL: ボクシングされたプリミティブ値の同期化</a></td><td>Multithreaded correctness</td></tr> |
| 315 <tr bgcolor="#ffffff"><td><a href="#DM_MONITOR_WAIT_ON_CONDITION">Dm: Condition
で wait メソッドを呼び出している</a></td><td>Multithreaded correctness</td></tr> |
| 316 <tr bgcolor="#eeeeee"><td><a href="#DM_USELESS_THREAD">Dm: デフォルトの空の run メソッドを使用し
て作成されたスレッド</a></td><td>Multithreaded correctness</td></tr> |
| 317 <tr bgcolor="#ffffff"><td><a href="#ESync_EMPTY_SYNC">ESync: 空の synchronized ブロッ
ク</a></td><td>Multithreaded correctness</td></tr> |
| 318 <tr bgcolor="#eeeeee"><td><a href="#IS2_INCONSISTENT_SYNC">IS: 一貫性のない同期化</a></td
><td>Multithreaded correctness</td></tr> |
| 319 <tr bgcolor="#ffffff"><td><a href="#IS_FIELD_NOT_GUARDED">IS: 並行アクセスに対してガードされていな
いフィールド</a></td><td>Multithreaded correctness</td></tr> |
| 320 <tr bgcolor="#eeeeee"><td><a href="#JLM_JSR166_LOCK_MONITORENTER">JLM: Lock で同期化
している</a></td><td>Multithreaded correctness</td></tr> |
| 321 <tr bgcolor="#ffffff"><td><a href="#JLM_JSR166_UTILCONCURRENT_MONITORENTER">JLM:
java.util.concurrent のインスタンスで同期化している</a></td><td>Multithreaded correctness</td>
</tr> |
| 322 <tr bgcolor="#eeeeee"><td><a href="#JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT">J
LM: util.concurrent 抽象でモニタスタイルの wait メソッドを使用している</a></td><td>Multithreaded corre
ctness</td></tr> |
| 323 <tr bgcolor="#ffffff"><td><a href="#LI_LAZY_INIT_STATIC">LI: static フィールドの間違った遅延
初期化</a></td><td>Multithreaded correctness</td></tr> |
| 324 <tr bgcolor="#eeeeee"><td><a href="#LI_LAZY_INIT_UPDATE_STATIC">LI: 更新される static
フィールドの間違った遅延初期化</a></td><td>Multithreaded correctness</td></tr> |
| 325 <tr bgcolor="#ffffff"><td><a href="#ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIEL
D">ML: フィールドを同期化でガードしようとする無駄な試み</a></td><td>Multithreaded correctness</td></tr> |
| 326 <tr bgcolor="#eeeeee"><td><a href="#ML_SYNC_ON_UPDATED_FIELD">ML: 更新されるフィールドで同期化
しているメソッド</a></td><td>Multithreaded correctness</td></tr> |
| 327 <tr bgcolor="#ffffff"><td><a href="#MSF_MUTABLE_SERVLET_FIELD">MSF: 可変サーブレットフィール
ド</a></td><td>Multithreaded correctness</td></tr> |
| 328 <tr bgcolor="#eeeeee"><td><a href="#MWN_MISMATCHED_NOTIFY">MWN: 不整合な notify メソッド
</a></td><td>Multithreaded correctness</td></tr> |
| 329 <tr bgcolor="#ffffff"><td><a href="#MWN_MISMATCHED_WAIT">MWN: 不整合な wait メソッド</a>
</td><td>Multithreaded correctness</td></tr> |
| 330 <tr bgcolor="#eeeeee"><td><a href="#NN_NAKED_NOTIFY">NN: 裸の notify メソッド</a></td>
<td>Multithreaded correctness</td></tr> |
| 331 <tr bgcolor="#ffffff"><td><a href="#NP_SYNC_AND_NULL_CHECK_FIELD">NP: 同じフィールドでの同
期化と null チェック</a></td><td>Multithreaded correctness</td></tr> |
| 332 <tr bgcolor="#eeeeee"><td><a href="#NO_NOTIFY_NOT_NOTIFYALL">No: notifyAll メソッドで
はなく notify メソッドを使用している</a></td><td>Multithreaded correctness</td></tr> |
| 333 <tr bgcolor="#ffffff"><td><a href="#RS_READOBJECT_SYNC">RS: readObject メソッドを同期化し
ているクラス</a></td><td>Multithreaded correctness</td></tr> |
| 334 <tr bgcolor="#eeeeee"><td><a href="#RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED">RV:
putIfAbsent の戻り値は無視されて putIfAbsent に渡した値は再利用された</a></td><td>Multithreaded correc
tness</td></tr> |
| 335 <tr bgcolor="#ffffff"><td><a href="#RU_INVOKE_RUN">Ru: スレッドで run メソッドを呼び出している</a
></td><td>Multithreaded correctness</td></tr> |
| 336 <tr bgcolor="#eeeeee"><td><a href="#SC_START_IN_CTOR">SC: Thread.start() を呼び出してい
るコンストラクタ</a></td><td>Multithreaded correctness</td></tr> |
| 337 <tr bgcolor="#ffffff"><td><a href="#SP_SPIN_ON_FIELD">SP: スピンロックをしているメソッド</a></t
d><td>Multithreaded correctness</td></tr> |
| 338 <tr bgcolor="#eeeeee"><td><a href="#STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE">ST
CAL: static Calendar の呼び出し</a></td><td>Multithreaded correctness</td></tr> |
| 339 <tr bgcolor="#ffffff"><td><a href="#STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE"
>STCAL: static DateFormat の呼び出し</a></td><td>Multithreaded correctness</td></tr> |
| 340 <tr bgcolor="#eeeeee"><td><a href="#STCAL_STATIC_CALENDAR_INSTANCE">STCAL: stati
c Calendar フィールド</a></td><td>Multithreaded correctness</td></tr> |
| 341 <tr bgcolor="#ffffff"><td><a href="#STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE">ST
CAL: static DateFormat</a></td><td>Multithreaded correctness</td></tr> |
| 342 <tr bgcolor="#eeeeee"><td><a href="#SWL_SLEEP_WITH_LOCK_HELD">SWL: ロックを保持して Thre
ad.sleep() を呼び出しているメソッド</a></td><td>Multithreaded correctness</td></tr> |
| 343 <tr bgcolor="#ffffff"><td><a href="#TLW_TWO_LOCK_WAIT">TLW: 2つ以上のロックを保持して wait メ
ソッドを呼び出している</a></td><td>Multithreaded correctness</td></tr> |
| 344 <tr bgcolor="#eeeeee"><td><a href="#UG_SYNC_SET_UNSYNC_GET">UG: 同期化していない get メソッ
ド、同期化している set メソッド</a></td><td>Multithreaded correctness</td></tr> |
| 345 <tr bgcolor="#ffffff"><td><a href="#UL_UNRELEASED_LOCK">UL: すべての経路でロックが解除されないメソッ
ド</a></td><td>Multithreaded correctness</td></tr> |
| 346 <tr bgcolor="#eeeeee"><td><a href="#UL_UNRELEASED_LOCK_EXCEPTION_PATH">UL: すべての例
外経路でロックが解除されないメソッド</a></td><td>Multithreaded correctness</td></tr> |
| 347 <tr bgcolor="#ffffff"><td><a href="#UW_UNCOND_WAIT">UW: wait メソッドの無条件呼び出し</a></t
d><td>Multithreaded correctness</td></tr> |
| 348 <tr bgcolor="#eeeeee"><td><a href="#VO_VOLATILE_INCREMENT">VO: volatile フィールドへのイ
ンクリメントはアトミックではない</a></td><td>Multithreaded correctness</td></tr> |
| 349 <tr bgcolor="#ffffff"><td><a href="#VO_VOLATILE_REFERENCE_TO_ARRAY">VO: 配列への vol
atile 参照は、配列要素を volatile として扱わない</a></td><td>Multithreaded correctness</td></tr> |
| 350 <tr bgcolor="#eeeeee"><td><a href="#WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL"
>WL: クラスリテラルではなく getClass で同期化している</a></td><td>Multithreaded correctness</td></t
r> |
| 351 <tr bgcolor="#ffffff"><td><a href="#WS_WRITEOBJECT_SYNC">WS: writeObject メソッドは同期
化しているがその他のメソッドは同期化していないクラス</a></td><td>Multithreaded correctness</td></tr> |
| 352 <tr bgcolor="#eeeeee"><td><a href="#WA_AWAIT_NOT_IN_LOOP">Wa: Condition.await()
がループの中にない</a></td><td>Multithreaded correctness</td></tr> |
| 353 <tr bgcolor="#ffffff"><td><a href="#WA_NOT_IN_LOOP">Wa: wait メソッドがループの中にない</a></
td><td>Multithreaded correctness</td></tr> |
| 354 <tr bgcolor="#eeeeee"><td><a href="#BX_BOXING_IMMEDIATELY_UNBOXED">Bx: プリミティブ値がボ
クシングされて、すぐにアンボクシングされる</a></td><td>Performance</td></tr> |
| 355 <tr bgcolor="#ffffff"><td><a href="#BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COE
RCION">Bx: プリミティブ値がプリミティブ型の型変換をするためにボクシングされて、アンボクシングされる</a></td><td>Performance<
/td></tr> |
| 356 <tr bgcolor="#eeeeee"><td><a href="#BX_UNBOXING_IMMEDIATELY_REBOXED">Bx: ボクシングされ
た値がアンボクシングされて、すぐに再ボクシングされる</a></td><td>Performance</td></tr> |
| 357 <tr bgcolor="#ffffff"><td><a href="#DM_BOXED_PRIMITIVE_FOR_PARSING">Bx: ボクシング/アン
ボクシングはプリミティブを解析する</a></td><td>Performance</td></tr> |
| 358 <tr bgcolor="#eeeeee"><td><a href="#DM_BOXED_PRIMITIVE_TOSTRING">Bx: toString メソ
ッドを呼び出すためにプリミティブ型のラッパクラスのインスタンスを作成している</a></td><td>Performance</td></tr> |
| 359 <tr bgcolor="#ffffff"><td><a href="#DM_FP_NUMBER_CTOR">Bx: 効率が悪い浮動小数点 Number コンス
トラクタを呼び出しているメソッド</a></td><td>Performance</td></tr> |
| 360 <tr bgcolor="#eeeeee"><td><a href="#DM_NUMBER_CTOR">Bx: 効率が悪い Number コンストラクタを呼び出
しているメソッド</a></td><td>Performance</td></tr> |
| 361 <tr bgcolor="#ffffff"><td><a href="#DMI_BLOCKING_METHODS_ON_URL">Dm: URL の equal
s メソッドと hashCode メソッドはブロックする</a></td><td>Performance</td></tr> |
| 362 <tr bgcolor="#eeeeee"><td><a href="#DMI_COLLECTION_OF_URLS">Dm: URL の Map や Set
はひどい性能になる可能性がある</a></td><td>Performance</td></tr> |
| 363 <tr bgcolor="#ffffff"><td><a href="#DM_BOOLEAN_CTOR">Dm: 効率が悪い Boolean コンストラクタを呼
び出しているメソッド</a></td><td>Performance</td></tr> |
| 364 <tr bgcolor="#eeeeee"><td><a href="#DM_GC">Dm: 明示的なガベージコレクション</a></td><td>Perfor
mance</td></tr> |
| 365 <tr bgcolor="#ffffff"><td><a href="#DM_NEW_FOR_GETCLASS">Dm: クラスオブジェクトを得るためだけにイン
スタンスを作成しているメソッド</a></td><td>Performance</td></tr> |
| 366 <tr bgcolor="#eeeeee"><td><a href="#DM_NEXTINT_VIA_NEXTDOUBLE">Dm: 整数の乱数を生成するために
は nextDouble メソッド ではなく nextInt メソッドを使用する</a></td><td>Performance</td></tr> |
| 367 <tr bgcolor="#ffffff"><td><a href="#DM_STRING_CTOR">Dm: 効率が悪い new String(String)
コンストラクタを呼び出しているメソッド</a></td><td>Performance</td></tr> |
| 368 <tr bgcolor="#eeeeee"><td><a href="#DM_STRING_TOSTRING">Dm: String の toString メソ
ッドを呼び出しているメソッド</a></td><td>Performance</td></tr> |
| 369 <tr bgcolor="#ffffff"><td><a href="#DM_STRING_VOID_CTOR">Dm: 効率が悪い new String()
コンストラクタを呼び出しているメソッド</a></td><td>Performance</td></tr> |
| 370 <tr bgcolor="#eeeeee"><td><a href="#HSC_HUGE_SHARED_STRING_CONSTANT">HSC: 複数のクラス
ファイルにわたって複製されている巨大な文字列定数</a></td><td>Performance</td></tr> |
| 371 <tr bgcolor="#ffffff"><td><a href="#IIO_INEFFICIENT_INDEX_OF">IIO: String.indexO
f(String) の非効率的な使用</a></td><td>Performance</td></tr> |
| 372 <tr bgcolor="#eeeeee"><td><a href="#IIO_INEFFICIENT_LAST_INDEX_OF">IIO: String.l
astIndexOf(String) の非効率的な使用</a></td><td>Performance</td></tr> |
| 373 <tr bgcolor="#ffffff"><td><a href="#ITA_INEFFICIENT_TO_ARRAY">ITA: 長さが0の配列の引数で t
oArray メソッドを使用しているメソッド</a></td><td>Performance</td></tr> |
| 374 <tr bgcolor="#eeeeee"><td><a href="#SBSC_USE_STRINGBUFFER_CONCATENATION">SBSC: ル
ープの中で + を使用して文字列を連結しているメソッド</a></td><td>Performance</td></tr> |
| 375 <tr bgcolor="#ffffff"><td><a href="#SIC_INNER_SHOULD_BE_STATIC">SIC: static 内部クラ
スにすべき</a></td><td>Performance</td></tr> |
| 376 <tr bgcolor="#eeeeee"><td><a href="#SIC_INNER_SHOULD_BE_STATIC_ANON">SIC: 名前付き s
tatic 内部クラスにリファクタリングできるかもしれない</a></td><td>Performance</td></tr> |
| 377 <tr bgcolor="#ffffff"><td><a href="#SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS">SIC:
static 内部クラスにリファクタリングできるかもしれない</a></td><td>Performance</td></tr> |
| 378 <tr bgcolor="#eeeeee"><td><a href="#SS_SHOULD_BE_STATIC">SS: 読み出されないフィールド</a></t
d><td>Performance</td></tr> |
| 379 <tr bgcolor="#ffffff"><td><a href="#UM_UNNECESSARY_MATH">UM: 定数値で Math クラスの stat
ic メソッドを呼び出しているメソッド</a></td><td>Performance</td></tr> |
| 380 <tr bgcolor="#eeeeee"><td><a href="#UPM_UNCALLED_PRIVATE_METHOD">UPM: private メソ
ッドは決して呼び出されない</a></td><td>Performance</td></tr> |
| 381 <tr bgcolor="#ffffff"><td><a href="#URF_UNREAD_FIELD">UrF: 読み出されないフィールド</a></td>
<td>Performance</td></tr> |
| 382 <tr bgcolor="#eeeeee"><td><a href="#UUF_UNUSED_FIELD">UuF: 未使用のフィールド</a></td><td
>Performance</td></tr> |
| 383 <tr bgcolor="#ffffff"><td><a href="#WMI_WRONG_MAP_ITERATOR">WMI: entrySet イテレータで
はなく効率が悪い keySet イテレータを使用している</a></td><td>Performance</td></tr> |
| 384 <tr bgcolor="#eeeeee"><td><a href="#DMI_CONSTANT_DB_PASSWORD">Dm: ハードコードされた定数データ
ベースパスワード</a></td><td>Security</td></tr> |
| 385 <tr bgcolor="#ffffff"><td><a href="#DMI_EMPTY_DB_PASSWORD">Dm: 空のデータベースパスワード</a>
</td><td>Security</td></tr> |
| 386 <tr bgcolor="#eeeeee"><td><a href="#HRS_REQUEST_PARAMETER_TO_COOKIE">HRS: 信頼できない
入力から形成された HTTP cookie</a></td><td>Security</td></tr> |
| 387 <tr bgcolor="#ffffff"><td><a href="#HRS_REQUEST_PARAMETER_TO_HTTP_HEADER">HRS: H
TTP レスポンススプリッティング脆弱性</a></td><td>Security</td></tr> |
| 388 <tr bgcolor="#eeeeee"><td><a href="#PT_ABSOLUTE_PATH_TRAVERSAL">PT: サーブレットの絶対パスト
ラバーサル</a></td><td>Security</td></tr> |
| 389 <tr bgcolor="#ffffff"><td><a href="#PT_RELATIVE_PATH_TRAVERSAL">PT: サーブレットの相対パスト
ラバーサル</a></td><td>Security</td></tr> |
| 390 <tr bgcolor="#eeeeee"><td><a href="#SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE">SQ
L: SQL の Statement の execute メソッドに定数でない文字列を渡している</a></td><td>Security</td></tr> |
| 391 <tr bgcolor="#ffffff"><td><a href="#SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCON
STANT_STRING">SQL: PreparedStatement が定数でない文字列から生成されている</a></td><td>Security</td
></tr> |
| 392 <tr bgcolor="#eeeeee"><td><a href="#XSS_REQUEST_PARAMETER_TO_JSP_WRITER">XSS: 反射
型クロスサイトスクリプティング脆弱性がある JSP</a></td><td>Security</td></tr> |
| 393 <tr bgcolor="#ffffff"><td><a href="#XSS_REQUEST_PARAMETER_TO_SEND_ERROR">XSS: 反射
型クロスサイトスクリプティング脆弱性がエラーページにあるサーブレット</a></td><td>Security</td></tr> |
| 394 <tr bgcolor="#eeeeee"><td><a href="#XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER">XSS
: 反射型クロスサイトスクリプティング脆弱性があるサーブレット</a></td><td>Security</td></tr> |
| 395 <tr bgcolor="#ffffff"><td><a href="#BC_BAD_CAST_TO_ABSTRACT_COLLECTION">BC: 抽象コレ
クションへの疑わしいキャスト</a></td><td>Dodgy code</td></tr> |
| 396 <tr bgcolor="#eeeeee"><td><a href="#BC_BAD_CAST_TO_CONCRETE_COLLECTION">BC: 具象コレ
クションへの疑わしいキャスト</a></td><td>Dodgy code</td></tr> |
| 397 <tr bgcolor="#ffffff"><td><a href="#BC_UNCONFIRMED_CAST">BC: 未チェック/未確認のキャスト</a><
/td><td>Dodgy code</td></tr> |
| 398 <tr bgcolor="#eeeeee"><td><a href="#BC_UNCONFIRMED_CAST_OF_RETURN_VALUE">BC: メソッ
ドからの戻り値の未チェック/未確認のキャスト</a></td><td>Dodgy code</td></tr> |
| 399 <tr bgcolor="#ffffff"><td><a href="#BC_VACUOUS_INSTANCEOF">BC: 常に true を返す insta
nceof</a></td><td>Dodgy code</td></tr> |
| 400 <tr bgcolor="#eeeeee"><td><a href="#ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT">BSH
IFT: 符号なし右シフトを short/byte にキャストしている</a></td><td>Dodgy code</td></tr> |
| 401 <tr bgcolor="#ffffff"><td><a href="#CI_CONFUSED_INHERITANCE">CI: final なクラスが pro
tected フィールドを宣言している</a></td><td>Dodgy code</td></tr> |
| 402 <tr bgcolor="#eeeeee"><td><a href="#DB_DUPLICATE_BRANCHES">DB: 2つの分岐のために同じコードを使用
しているメソッド</a></td><td>Dodgy code</td></tr> |
| 403 <tr bgcolor="#ffffff"><td><a href="#DB_DUPLICATE_SWITCH_CLAUSES">DB: switch 文の2つ
の case のために同じコードを使用しているメソッド</a></td><td>Dodgy code</td></tr> |
| 404 <tr bgcolor="#eeeeee"><td><a href="#DLS_DEAD_LOCAL_STORE">DLS: ローカル変数への無効な代入</a>
</td><td>Dodgy code</td></tr> |
| 405 <tr bgcolor="#ffffff"><td><a href="#DLS_DEAD_LOCAL_STORE_IN_RETURN">DLS: return
文に役に立たない代入がある</a></td><td>Dodgy code</td></tr> |
| 406 <tr bgcolor="#eeeeee"><td><a href="#DLS_DEAD_LOCAL_STORE_OF_NULL">DLS: ローカル変数への無
効な null 代入</a></td><td>Dodgy code</td></tr> |
| 407 <tr bgcolor="#ffffff"><td><a href="#DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD">DLS: フィー
ルドを遮るローカル変数への無効な代入</a></td><td>Dodgy code</td></tr> |
| 408 <tr bgcolor="#eeeeee"><td><a href="#DMI_HARDCODED_ABSOLUTE_FILENAME">DMI: ハードコード
された絶対パス名への参照がある</a></td><td>Dodgy code</td></tr> |
| 409 <tr bgcolor="#ffffff"><td><a href="#DMI_NONSERIALIZABLE_OBJECT_WRITTEN">DMI: Obj
ectOutput に書き込まれる非直列化可能オブジェクト</a></td><td>Dodgy code</td></tr> |
| 410 <tr bgcolor="#eeeeee"><td><a href="#DMI_USELESS_SUBSTRING">DMI: substring(0) の呼び
出しは元の値を返す</a></td><td>Dodgy code</td></tr> |
| 411 <tr bgcolor="#ffffff"><td><a href="#DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED">D
m: Thread オブジェクトが Runnable が期待されているところに渡されている</a></td><td>Dodgy code</td></tr> |
| 412 <tr bgcolor="#eeeeee"><td><a href="#EQ_DOESNT_OVERRIDE_EQUALS">Eq: スーパークラスの equa
ls メソッドをオーバーライドしていないクラス</a></td><td>Dodgy code</td></tr> |
| 413 <tr bgcolor="#ffffff"><td><a href="#EQ_UNUSUAL">Eq: 異常な equals メソッド </a></td><td
>Dodgy code</td></tr> |
| 414 <tr bgcolor="#eeeeee"><td><a href="#FE_FLOATING_POINT_EQUALITY">FE: 浮動小数点の等価性のため
のテスト</a></td><td>Dodgy code</td></tr> |
| 415 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN">
FS: Boolean 型でない引数を %b 書式指示子を使用してフォーマットしている</a></td><td>Dodgy code</td></tr> |
| 416 <tr bgcolor="#eeeeee"><td><a href="#IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTE
R_METHOD">IA: 潜在的な継承されたメソッドなのか外部のメソッドなのかあいまいなメソッドの呼び出し</a></td><td>Dodgy code</t
d></tr> |
| 417 <tr bgcolor="#ffffff"><td><a href="#IC_INIT_CIRCULARITY">IC: 初期化が循環している</a></td>
<td>Dodgy code</td></tr> |
| 418 <tr bgcolor="#eeeeee"><td><a href="#ICAST_IDIV_CAST_TO_DOUBLE">ICAST: 整数の除算の結果を
double または float にキャストしている</a></td><td>Dodgy code</td></tr> |
| 419 <tr bgcolor="#ffffff"><td><a href="#ICAST_INTEGER_MULTIPLY_CAST_TO_LONG">ICAST:
整数乗算の結果を long にキャストしている</a></td><td>Dodgy code</td></tr> |
| 420 <tr bgcolor="#eeeeee"><td><a href="#IM_AVERAGE_COMPUTATION_COULD_OVERFLOW">IM: 平
均の計算はオーバーフローする可能性がある</a></td><td>Dodgy code</td></tr> |
| 421 <tr bgcolor="#ffffff"><td><a href="#IM_BAD_CHECK_FOR_ODD">IM: 負数で機能しない奇数チェック</a>
</td><td>Dodgy code</td></tr> |
| 422 <tr bgcolor="#eeeeee"><td><a href="#INT_BAD_REM_BY_1">INT: 1を法とする整数の剰余</a></td><
td>Dodgy code</td></tr> |
| 423 <tr bgcolor="#ffffff"><td><a href="#INT_VACUOUS_BIT_OPERATION">INT: 整数値の無意味なビットマ
スク演算</a></td><td>Dodgy code</td></tr> |
| 424 <tr bgcolor="#eeeeee"><td><a href="#INT_VACUOUS_COMPARISON">INT: 整数値の無意味な比較</a><
/td><td>Dodgy code</td></tr> |
| 425 <tr bgcolor="#ffffff"><td><a href="#MTIA_SUSPECT_SERVLET_INSTANCE_FIELD">MTIA: S
ervlet クラスを拡張したクラスでのインスタンス変数の使用</a></td><td>Dodgy code</td></tr> |
| 426 <tr bgcolor="#eeeeee"><td><a href="#MTIA_SUSPECT_STRUTS_INSTANCE_FIELD">MTIA: St
ruts Action を拡張したクラスでのインスタンス変数の使用</a></td><td>Dodgy code</td></tr> |
| 427 <tr bgcolor="#ffffff"><td><a href="#NP_DEREFERENCE_OF_READLINE_VALUE">NP: readLi
ne メソッドの結果が null なのか確かめないで値を利用している</a></td><td>Dodgy code</td></tr> |
| 428 <tr bgcolor="#eeeeee"><td><a href="#NP_IMMEDIATE_DEREFERENCE_OF_READLINE">NP: re
adLine メソッドの結果をすぐに利用している</a></td><td>Dodgy code</td></tr> |
| 429 <tr bgcolor="#ffffff"><td><a href="#NP_LOAD_OF_KNOWN_NULL_VALUE">NP: null とわかってい
る値のロード</a></td><td>Dodgy code</td></tr> |
| 430 <tr bgcolor="#eeeeee"><td><a href="#NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION">NP:
メソッドはパラメータに nullness アノテーションを強化している</a></td><td>Dodgy code</td></tr> |
| 431 <tr bgcolor="#ffffff"><td><a href="#NP_METHOD_RETURN_RELAXING_ANNOTATION">NP: メソ
ッドは戻り値の nullness アノテーションを緩和している</a></td><td>Dodgy code</td></tr> |
| 432 <tr bgcolor="#eeeeee"><td><a href="#NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE">NP:
null になっている可能性があるメソッドの戻り値を利用している</a></td><td>Dodgy code</td></tr> |
| 433 <tr bgcolor="#ffffff"><td><a href="#NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE">NP
: null 値を実行不可能かもしれない分岐で利用している可能性がある</a></td><td>Dodgy code</td></tr> |
| 434 <tr bgcolor="#eeeeee"><td><a href="#NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_N
ULLABLE">NP: パラメータは 非 null でなければならないが null 可能としてアノテートされている</a></td><td>Dodgy co
de</td></tr> |
| 435 <tr bgcolor="#ffffff"><td><a href="#NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD">NP:
書き込まれていない public または protected フィールドの読み出し</a></td><td>Dodgy code</td></tr> |
| 436 <tr bgcolor="#eeeeee"><td><a href="#NS_DANGEROUS_NON_SHORT_CIRCUIT">NS: 潜在的な非短絡論
理の危険な使用</a></td><td>Dodgy code</td></tr> |
| 437 <tr bgcolor="#ffffff"><td><a href="#NS_NON_SHORT_CIRCUIT">NS: 非短絡論理の疑わしい使用</a></
td><td>Dodgy code</td></tr> |
| 438 <tr bgcolor="#eeeeee"><td><a href="#PZLA_PREFER_ZERO_LENGTH_ARRAYS">PZLA: null で
はなく長さが0の配列を返すことを検討する</a></td><td>Dodgy code</td></tr> |
| 439 <tr bgcolor="#ffffff"><td><a href="#QF_QUESTIONABLE_FOR_LOOP">QF: 複雑か巧妙か間違ったインクリ
メントの for ループ</a></td><td>Dodgy code</td></tr> |
| 440 <tr bgcolor="#eeeeee"><td><a href="#RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL
_VALUE">RCN: 非 null 値と null 値との冗長な比較</a></td><td>Dodgy code</td></tr> |
| 441 <tr bgcolor="#ffffff"><td><a href="#RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES">RC
N: 2つの null 値の冗長な比較</a></td><td>Dodgy code</td></tr> |
| 442 <tr bgcolor="#eeeeee"><td><a href="#RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE">RC
N: null でないことがわかっている値の冗長な null チェック</a></td><td>Dodgy code</td></tr> |
| 443 <tr bgcolor="#ffffff"><td><a href="#RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE">RCN:
null とわかっている値の冗長な null チェック</a></td><td>Dodgy code</td></tr> |
| 444 <tr bgcolor="#eeeeee"><td><a href="#REC_CATCH_EXCEPTION">REC: 例外がスローされないのに例外をキャッ
チしている</a></td><td>Dodgy code</td></tr> |
| 445 <tr bgcolor="#ffffff"><td><a href="#RI_REDUNDANT_INTERFACES">RI: スーパークラスと同じインタフェ
ースを実装しているクラス</a></td><td>Dodgy code</td></tr> |
| 446 <tr bgcolor="#eeeeee"><td><a href="#RV_CHECK_FOR_POSITIVE_INDEXOF">RV: String.in
dexOf の結果が正かどうか確かめている</a></td><td>Dodgy code</td></tr> |
| 447 <tr bgcolor="#ffffff"><td><a href="#RV_DONT_JUST_NULL_CHECK_READLINE">RV: readLi
ne メソッドの結果を null でないのか確かめた後で捨てている</a></td><td>Dodgy code</td></tr> |
| 448 <tr bgcolor="#eeeeee"><td><a href="#RV_REM_OF_HASHCODE">RV: ハッシュコードの剰余は負かもしれない</
a></td><td>Dodgy code</td></tr> |
| 449 <tr bgcolor="#ffffff"><td><a href="#RV_REM_OF_RANDOM_INT">RV: 符号付き32ビット整数の乱数の剰余<
/a></td><td>Dodgy code</td></tr> |
| 450 <tr bgcolor="#eeeeee"><td><a href="#RV_RETURN_VALUE_IGNORED_INFERRED">RV: メソッドは戻
り値を無視しています、これは間違いではないですか?</a></td><td>Dodgy code</td></tr> |
| 451 <tr bgcolor="#ffffff"><td><a href="#SA_FIELD_DOUBLE_ASSIGNMENT">SA: フィールドの二重代入</
a></td><td>Dodgy code</td></tr> |
| 452 <tr bgcolor="#eeeeee"><td><a href="#SA_LOCAL_DOUBLE_ASSIGNMENT">SA: ローカル変数の二重代入<
/a></td><td>Dodgy code</td></tr> |
| 453 <tr bgcolor="#ffffff"><td><a href="#SA_LOCAL_SELF_ASSIGNMENT">SA: ローカル変数の自己代入</a
></td><td>Dodgy code</td></tr> |
| 454 <tr bgcolor="#eeeeee"><td><a href="#SF_SWITCH_FALLTHROUGH">SF: 1つの case が次の case
へと通り抜ける switch 文を発見した</a></td><td>Dodgy code</td></tr> |
| 455 <tr bgcolor="#ffffff"><td><a href="#SF_SWITCH_NO_DEFAULT">SF: default がない switch
文を発見した</a></td><td>Dodgy code</td></tr> |
| 456 <tr bgcolor="#eeeeee"><td><a href="#ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD">ST:
インスタンスメソッドから static フィールドへの書き込み</a></td><td>Dodgy code</td></tr> |
| 457 <tr bgcolor="#ffffff"><td><a href="#SE_PRIVATE_READ_RESOLVE_NOT_INHERITED">Se: サ
ブクラスで継承できない private な readResolve メソッド</a></td><td>Dodgy code</td></tr> |
| 458 <tr bgcolor="#eeeeee"><td><a href="#SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS"
>Se: Serializable でないクラスの transient フィールド</a></td><td>Dodgy code</td></tr> |
| 459 <tr bgcolor="#ffffff"><td><a href="#TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALW
AYS_SINK">TQ: 値は型修飾子を必要としているが、不明としてマークされている</a></td><td>Dodgy code</td></tr> |
| 460 <tr bgcolor="#eeeeee"><td><a href="#TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEV
ER_SINK">TQ: 値は型修飾子を必要としないが、不明としてマークされている</a></td><td>Dodgy code</td></tr> |
| 461 <tr bgcolor="#ffffff"><td><a href="#UCF_USELESS_CONTROL_FLOW">UCF: 役に立たない制御フロー</
a></td><td>Dodgy code</td></tr> |
| 462 <tr bgcolor="#eeeeee"><td><a href="#UCF_USELESS_CONTROL_FLOW_NEXT_LINE">UCF: 次の行
へ続くだけの役に立たない制御フロー</a></td><td>Dodgy code</td></tr> |
| 463 <tr bgcolor="#ffffff"><td><a href="#URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD">UrF: 読
み出されない public または protected フィールド</a></td><td>Dodgy code</td></tr> |
| 464 <tr bgcolor="#eeeeee"><td><a href="#UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD">UuF: 未
使用の public または protected フィールド</a></td><td>Dodgy code</td></tr> |
| 465 <tr bgcolor="#ffffff"><td><a href="#UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR">Uw
F: コンストラクタで初期化されていないフィールドを null チェックなしで null 値を利用している</a></td><td>Dodgy code</td
></tr> |
| 466 <tr bgcolor="#eeeeee"><td><a href="#UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD">UwF
: 書き込まてれいない public または protected フィールド</a></td><td>Dodgy code</td></tr> |
| 467 <tr bgcolor="#ffffff"><td><a href="#XFB_XML_FACTORY_BYPASS">XFB: XMLインタフェースの特定の実
装のインスタンスを作成しているメソッド</a></td><td>Dodgy code</td></tr> |
| 468 </table> |
| 469 <h2>Descriptions</h2> |
| 470 <h3><a name="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS">BC: equals メソッドは引数の型を
仮定するべきではない (BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS)</a></h3> |
| 471 |
| 472 |
| 473 <p> |
| 474 <code>equals(Object o)</code> メソッドは、<code>o</code> の型についてどんな仮定もするべきではありません。 |
| 475 <code>o</code> が <code>this</code> と同じ型でないなら単に false を返すべきです。 |
| 476 </p> |
| 477 |
| 478 |
| 479 <h3><a name="BIT_SIGNED_CHECK">BIT: ビット演算の符号をチェックする (BIT_SIGNED_CHECK)</a></h3> |
| 480 |
| 481 |
| 482 <p> |
| 483 このメソッドは、<code>((event.detail & SWT.SELECTED) > 0)</code> のような式を比較しています。 |
| 484 ビット演算をより大きい演算子で比較することは、予想外の結果 (もちろん、<code>SWT.SELECTED</code> の値による) の原因になる可能性があ
ります。 |
| 485 <code>SWT.SELECTED</code> が負数であるなら、これはバグの候補です。 |
| 486 <code>SWT.SELECTED</code> が負ではないとしても、'> 0' の代わりに '!= 0' を使うことは良いプラクティスと思われます。 |
| 487 </p> |
| 488 <p> |
| 489 Boris Bokowski |
| 490 </p> |
| 491 |
| 492 |
| 493 <h3><a name="CN_IDIOM">CN: Cloneable を実装したクラスが clone メソッドを定義していないか、使用していない (CN_I
DIOM)</a></h3> |
| 494 |
| 495 |
| 496 <p> |
| 497 このクラスは、<code>Cloneable</code> を実装していますが、<code>clone</code> メソッドを定義していないか使用していません
。 |
| 498 </p> |
| 499 |
| 500 |
| 501 <h3><a name="CN_IDIOM_NO_SUPER_CALL">CN: clone メソッドが super.clone() を呼び出していない (CN
_IDIOM_NO_SUPER_CALL)</a></h3> |
| 502 |
| 503 |
| 504 <p> |
| 505 この非 final クラスは、<code>super.clone()</code> を呼び出さない <code>clone</code> メソッドを定義していま
す。 |
| 506 クラス <i>A</i> がサブクラス <i>B</i> によって拡張され、サブクラス <i>B</i> が <code>super.clone()</code
> を呼び出すなら、クラス <i>B</i> の <code>clone</code> メソッドは、型 <i>A</i> のオブジェクトを返す可能性が高いです。 |
| 507 これは <code>clone</code> のための汎用規約に違反します。 |
| 508 </p> |
| 509 <p> |
| 510 すべての <code>clone</code> メソッドが <code>super.clone()</code> を呼び出すなら <code>Object.cl
one()</code> が呼び出されることが保証され、常に正しい型のオブジェクトが返されます。 |
| 511 </p> |
| 512 |
| 513 |
| 514 <h3><a name="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE">CN: Cloneable を実装していないクラスが c
lone メソッドを定義している (CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE)</a></h3> |
| 515 |
| 516 |
| 517 <p> |
| 518 このクラスは、<code>Cloneable</code> を実装していないのに <code>clone</code> メソッドを定義しています。 |
| 519 これが OK (たとえば、サブクラスのクローンの実装を自分自身で制御したい場合です) という状況もありますが意図したことなのか確認してください。 |
| 520 </p> |
| 521 |
| 522 |
| 523 <h3><a name="CNT_ROUGH_CONSTANT_VALUE">CNT: 既知の定数の雑な値を見つける (CNT_ROUGH_CONSTANT_V
ALUE)</a></h3> |
| 524 |
| 525 |
| 526 <p> |
| 527 コードの明確さともっと良い正確さのために定義済みライブラリ定数を使うことを推奨します。 |
| 528 </p> |
| 529 |
| 530 |
| 531 <h3><a name="CO_ABSTRACT_SELF">Co: 抽象クラスは共変な compareTo メソッドを定義している (CO_ABSTRACT_
SELF)</a></h3> |
| 532 |
| 533 |
| 534 <p> |
| 535 このクラスは、共変な <code>compareTo</code> メソッドを定義しています。 |
| 536 <code>Comparable</code> インタフェースの <code>compareTo</code> メソッドを正しく実装するためには <code>c
ompareTo</code> メソッドのパラメータの型は、<code>java.lang.Object</code> でなければなりません。 |
| 537 </p> |
| 538 |
| 539 |
| 540 <h3><a name="CO_SELF_NO_OBJECT">Co: 共変な compareTo メソッドの定義 (CO_SELF_NO_OBJECT)</a
></h3> |
| 541 |
| 542 |
| 543 <p> |
| 544 このクラスは、共変な <code>compareTo</code> メソッドを定義しています。 |
| 545 <code>Comparable</code> インタフェースの <code>compareTo</code> メソッドを正しく実装するためには <code>c
ompareTo</code> メソッドのパラメータの型は、<code>java.lang.Object</code> でなければなりません。 |
| 546 </p> |
| 547 |
| 548 |
| 549 <h3><a name="DE_MIGHT_DROP">DE: 例外を捨てているかもしれないメソッド (DE_MIGHT_DROP)</a></h3> |
| 550 |
| 551 |
| 552 <p> |
| 553 このメソッドは、例外を捨てているかもしれません。 |
| 554 一般にキャッチした例外は何らかの方法で処理、または報告するべきです、あるいはメソッドからスローするべきです。 |
| 555 </p> |
| 556 |
| 557 |
| 558 <h3><a name="DE_MIGHT_IGNORE">DE: 例外を無視しているかもしれないメソッド (DE_MIGHT_IGNORE)</a></h3> |
| 559 |
| 560 |
| 561 <p> |
| 562 このメソッドは例外を無視しているかもしれません。 |
| 563 一般に例外は何らかの方法で処理、または報告するべきです、あるいはメソッドからスローするべきです。 |
| 564 </p> |
| 565 |
| 566 |
| 567 <h3><a name="DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS">DMI: エントリセットの要素を加えることは、Entr
y オブジェクトの再利用のために失敗するかもしれない (DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS)</a></h3> |
| 568 |
| 569 |
| 570 <p> |
| 571 entrySet メソッドは、一つの Entry オブジェクトを再利用し、反復中に返される基底 Map のビューを返すことが許可されています。 |
| 572 Java 1.6 の時点で、IdentityHashMap と EnumMap の両方がそうしました。 |
| 573 そのような Map を通して繰り返すとき、エントリ値は次の繰り返しへ進むまでが有効です。 |
| 574 たとえば、addAll メソッドにそのような entrySet を渡そうと試みるのは、ひどく間違っているでしょう。 |
| 575 </p> |
| 576 |
| 577 |
| 578 <h3><a name="DMI_RANDOM_USED_ONLY_ONCE">DMI: Random オブジェクトが作成され1度しか使われない (DMI_RA
NDOM_USED_ONLY_ONCE)</a></h3> |
| 579 |
| 580 |
| 581 <p> |
| 582 このコードは、<code>java.util.Random</code> オブジェクトを作成して1つの乱数を生成するために使用して捨てています。 |
| 583 これはあまり良くない品質の乱数を作り出し、効率が悪いです。 |
| 584 できれば、<code>Random</code> オブジェクトを1つだけ作成して保存されるようにコードを書き直してください。 |
| 585 そして、新しい乱数が必要なたびに既存の <code>Random</code> オブジェクトでメソッドを呼び出してください。 |
| 586 </p> |
| 587 <p> |
| 588 生成された乱数が推測可能でないことが重要なら、乱数ごとに新しい <code>Random</code> オブジェクトを作成してはいけません (値はあまりに簡単に
推測可能です)。 |
| 589 その代わりに <code>java.security.SecureRandom</code> の使用を強く検討するべきです (そして必要とされる乱数ごとに新しい
<code>SecureRandom</code> のオブジェクトを作成することを回避します)。 |
| 590 </p> |
| 591 |
| 592 |
| 593 <h3><a name="DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION">DMI: コレクションを消去するために remove
All メソッドを使用しない (DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION)</a></h3> |
| 594 |
| 595 |
| 596 <p> |
| 597 コレクション <code>c</code> からすべての要素を除去したいなら、<code>c.removeAll(c)</code> ではなく <code>c.
clear</code> を使用してください。 |
| 598 コレクションを消去するために <code>c.removeAll(c)</code> を呼び出すことは、それほど明確ではなく、タイプミスからの誤りに影響されやす
く、効率的ではなく、いくつかのコレクションでは、<code>ConcurrentModificationException</code> をスローするかもしれま
せん。 |
| 599 </p> |
| 600 |
| 601 |
| 602 <h3><a name="DM_EXIT">Dm: System.exit(...) を呼び出しているメソッド (DM_EXIT)</a></h3> |
| 603 |
| 604 |
| 605 <p> |
| 606 <code>System.exit(...)</code> を呼び出すことは、Java 仮想マシン全体をシャットダウンさせてしまいます。 |
| 607 それが適切な場合にだけ使用するべきです。 |
| 608 <code>System.exit(...)</code> の呼び出しはコードが他のコードによって呼び出されることを困難か不可能にします。 |
| 609 その代わりに RuntimeException をスローすることを検討してください。 |
| 610 </p> |
| 611 |
| 612 |
| 613 <h3><a name="DM_RUN_FINALIZERS_ON_EXIT">Dm: 危険なメソッド runFinalizersOnExit を呼び出している
メソッド (DM_RUN_FINALIZERS_ON_EXIT)</a></h3> |
| 614 |
| 615 |
| 616 <p> |
| 617 どんな理由があるにせよ決して <code>System.runFinalizersOnExit</code> と <code>Runtime.runFinali
zersOnExit</code> を呼び出さないでください。 |
| 618 Java ライブラリで最も危険なメソッドの1つです。 -- Joshua Bloch |
| 619 </p> |
| 620 |
| 621 |
| 622 <h3><a name="ES_COMPARING_PARAMETER_STRING_WITH_EQ">ES: String パラメータを == や != を使
用して比較している (ES_COMPARING_PARAMETER_STRING_WITH_EQ)</a></h3> |
| 623 |
| 624 |
| 625 <p> |
| 626 このコードは、参照等価性のために == や != を使用して <code>java.lang.String</code> パラメータを比較しています。 |
| 627 文字列定数または正準化された文字列だけをメソッドに渡すことを呼び出し元に要求することは必要以上に脆弱で測定可能な性能の向上をもたらしません。 |
| 628 その代わりに <code>equals(Object)</code> メソッドを使うことを検討してください。 |
| 629 </p> |
| 630 |
| 631 |
| 632 <h3><a name="ES_COMPARING_STRINGS_WITH_EQ">ES: String オブジェクトを == や != を使用して比較してい
る (ES_COMPARING_STRINGS_WITH_EQ)</a></h3> |
| 633 |
| 634 |
| 635 <p> |
| 636 このコードは、参照等価性のために == や != を使用して <code>java.lang.String</code> オブジェクトを比較しています。 |
| 637 両方の文字列がソースファイルの定数か、<code>String.intern()</code> を使用して正準化されていないかぎり、同じ文字列は2つの異なる S
tring オブジェクトによって表されるかもしれません。 |
| 638 その代わりに <code>equals(Object)</code> メソッドを使うことを検討してください。 |
| 639 </p> |
| 640 |
| 641 |
| 642 <h3><a name="EQ_ABSTRACT_SELF">Eq: 抽象クラスは共変な equals メソッドを宣言している (EQ_ABSTRACT_SEL
F)</a></h3> |
| 643 |
| 644 |
| 645 <p> |
| 646 このクラスは、共変な <code>equals</code> メソッドを定義しています。 |
| 647 <code>java.lang.Object</code> の <code>equals</code> メソッドを正しくオーバーライドするためには <code>
equals</code> メソッドのパラメータの型は、<code>java.lang.Object</code> でなければなりません。 |
| 648 </p> |
| 649 |
| 650 |
| 651 <h3><a name="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS">Eq: equals メソッドは互換性の
ないオペランドをチェックしている (EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS)</a></h3> |
| 652 |
| 653 |
| 654 <p> |
| 655 この <code>equals</code> メソッドは、引数が互換性のない型 (すなわちスーパタイプでもなく、<code>equals</code> メソッド
を定義しているクラスのスーパータイプでもサブタイプでもないクラス) なのか確かめています。 |
| 656 たとえば、<code>Foo</code> クラスの <code>equals</code> メソッドはそのように見えるかもしれません。 |
| 657 </p> |
| 658 <blockquote><pre> |
| 659 public boolean equals(Object o) { |
| 660 if (o instanceof Foo) |
| 661 return name.equals(((Foo)o).name); |
| 662 else if (o instanceof String) |
| 663 return name.equals(o); |
| 664 else return false; |
| 665 } |
| 666 </pre></blockquote> |
| 667 <p> |
| 668 これは対称的で推移的である <code>equals</code> メソッドを実現するのはとても難しいので、間違ったプラクティスと見なされています。 |
| 669 プロパティがなければまったく予想していない振る舞いが起こりえます。 |
| 670 </p> |
| 671 |
| 672 |
| 673 <h3><a name="EQ_COMPARETO_USE_OBJECT_EQUALS">Eq: compareTo(...) メソッドを定義して Object
.equals() を使用しているクラス (EQ_COMPARETO_USE_OBJECT_EQUALS)</a></h3> |
| 674 |
| 675 |
| 676 <p> |
| 677 このクラスは、<code>compareTo(...)</code> メソッドを定義していますが、<code>equals</code> メソッドは <code
>java.lang.Object</code> から継承しています。 |
| 678 一般に、<code>equals</code> メソッドが true を返す場合に限り、<code>compareTo</code> メソッドは0を返すべきです
。 |
| 679 これが違反されるなら奇妙で予測できない失敗が PriorityQueue などのクラスで発生します。 |
| 680 J2SE 5.0では、<code>PriorityQueue.remove()</code> は <code>compareTo</code> メソッドを使用し
ますが、Java SE 6では、<code>equals</code> メソッドを使用します。 |
| 681 </p> |
| 682 <p> |
| 683 Comparable インタフェースの compareTo メソッドの JavaDoc を以下に引用します。 |
| 684 </p> |
| 685 <blockquote><p> |
| 686 必須というわけではありませんが、<code>(x.compareTo(y)==0) == (x.equals(y))</code> であることが強く推奨されます
。 |
| 687 一般に、<code>Comparable</code> インタフェースを実装しているクラスで、この条件に違反するクラスは明確にこの事実を示す必要があります。 |
| 688 「注:このクラスは <code>equals</code> と一貫性のない自然順序付けを持ちます」などと明示することをお勧めします。 |
| 689 </p></blockquote> |
| 690 |
| 691 |
| 692 <h3><a name="EQ_GETCLASS_AND_CLASS_CONSTANT">Eq: equals メソッドはサブタイプのために失敗する (EQ_G
ETCLASS_AND_CLASS_CONSTANT)</a></h3> |
| 693 |
| 694 |
| 695 <p> |
| 696 このクラスは、サブクラスによる継承によって壊れる <code>equlas</code> メソッドがあります。 |
| 697 <code>equals</code> メソッドは、クラスリテラルを引数のクラスと比較しています (たとえば、<code>Foo</code> クラスで <co
de>Foo.class == o.getClass()</code> のような判定を行っています)。 |
| 698 <code>this.getClass() == o.getClass()</code> の方がより良いです。 |
| 699 </p> |
| 700 |
| 701 |
| 702 <h3><a name="EQ_SELF_NO_OBJECT">Eq: 共変な equals メソッドの定義 (EQ_SELF_NO_OBJECT)</a></
h3> |
| 703 |
| 704 |
| 705 <p> |
| 706 このクラスは、共変な <code>equals</code> メソッドを定義しています。 |
| 707 <code>java.lang.Object</code> の <code>equals</code> メソッドを正しくオーバーライドするためには <code>
equals</code> メソッドのパラメータの型は、<code>java.lang.Object</code> でなければなりません。 |
| 708 </p> |
| 709 |
| 710 |
| 711 <h3><a name="FI_EMPTY">FI: 空のファイナライザは削除するべき (FI_EMPTY)</a></h3> |
| 712 |
| 713 |
| 714 <p> |
| 715 空の <code>finalize</code> メソッドは役に立たないので削除するべきです。 |
| 716 </p> |
| 717 |
| 718 |
| 719 <h3><a name="FI_EXPLICIT_INVOCATION">FI: ファイナライザの明示的な呼び出し (FI_EXPLICIT_INVOCATIO
N)</a></h3> |
| 720 |
| 721 |
| 722 <p> |
| 723 このメソッドには明示的にオブジェクトで <code>finalize</code> メソッドの呼び出しがあります。 |
| 724 ファイナライザは Java 仮想マシンによって1度だけ実行されることになっているので、これは間違った考えです。 |
| 725 </p> |
| 726 <p> |
| 727 参照によってつながった複数のオブジェクトがファイナライズ可能になると、Java 仮想マシンはすべてのオブジェクトの <code>finalize</code>
メソッドを呼び出します。 |
| 728 おそらく異なるスレッドで同時にです。 |
| 729 したがって、クラス <i>X</i> の <code>finalize</code> メソッドの中から <i>X</i> によって参照されているオブジェクトの
<code>finalize</code> メソッドを呼び出すのは、とりわけ間違った考えです。 |
| 730 なぜなら、オブジェクトがすでに別のスレッドによってファイナライズされているかもしれないからです。 |
| 731 </p> |
| 732 |
| 733 |
| 734 <h3><a name="FI_FINALIZER_NULLS_FIELDS">FI: ファイナライザはフィールドを null にする (FI_FINALIZE
R_NULLS_FIELDS)</a></h3> |
| 735 |
| 736 |
| 737 <p> |
| 738 このファイナライザは、フィールドを null にしています。 |
| 739 これは通常誤りでガベージコレクタを助けません。オブジェクトはいずれにしろガベージされます。 |
| 740 </p> |
| 741 |
| 742 |
| 743 <h3><a name="FI_FINALIZER_ONLY_NULLS_FIELDS">FI: ファイナライザはフィールドを null にするだけ (FI_F
INALIZER_ONLY_NULLS_FIELDS)</a></h3> |
| 744 |
| 745 |
| 746 <p> |
| 747 このファイナライザは、フィールドを null にすること以外に何もしません。 |
| 748 これはまったく無意味であり、オブジェクトがガベージされ、ファイナライズされ、再びガベージされることを要求しています。 |
| 749 <code>finalize</code> メソッドを削除するべきです。 |
| 750 </p> |
| 751 |
| 752 |
| 753 <h3><a name="FI_MISSING_SUPER_CALL">FI: ファイナライザはスーパークラスのファイナライザを呼び出していない (FI_MIS
SING_SUPER_CALL)</a></h3> |
| 754 |
| 755 |
| 756 <p> |
| 757 この <code>finalize</code> メソッドは、スーパークラスの <code>finalize</code> メソッドを呼び出していません。 |
| 758 したがって、スーパークラスのために定義されたどんなファイナライザアクションも実行されません。 |
| 759 <code>super.finalize()</code> の呼び出しを追加してください。 |
| 760 </p> |
| 761 |
| 762 |
| 763 <h3><a name="FI_NULLIFY_SUPER">FI: ファイナライザはスーパークラスのファイナライザを無効にしている (FI_NULLIFY_S
UPER)</a></h3> |
| 764 |
| 765 |
| 766 <p> |
| 767 この空の <code>finalize</code> メソッドは、明示的にスーパークラスによって定義されたどんなファイナライザの効果も無効にします。 |
| 768 スーパークラスのために定義されたどんなファイナライザアクションも実行されません。 |
| 769 これが意図したことではない場合、メソッドを削除してください。 |
| 770 </p> |
| 771 |
| 772 |
| 773 <h3><a name="FI_USELESS">FI: ファイナライザはスーパークラスのファイナライザを呼び出しているだけ (FI_USELESS)</a><
/h3> |
| 774 |
| 775 |
| 776 <p> |
| 777 この <code>finalize</code> メソッドは、スーパークラスの <code>finalize</code> メソッドを呼び出しているだけです。 |
| 778 冗長なので削除してください。 |
| 779 </p> |
| 780 |
| 781 |
| 782 <h3><a name="VA_FORMAT_STRING_USES_NEWLINE">FS: 書式文字列は \n よりも %n を使用するべき (VA_FOR
MAT_STRING_USES_NEWLINE)</a></h3> |
| 783 |
| 784 |
| 785 <p> |
| 786 この書式文字列には改行文字 (\n) が含まれています。 |
| 787 一般に書式文字列には %n を使用することがより望ましいです。%n は、プラットホーム特有の行セパレータを作り出します。 |
| 788 </p> |
| 789 |
| 790 |
| 791 <h3><a name="GC_UNCHECKED_TYPE_IN_GENERIC_CALL">GC: 検査されない型への総称呼び出し (GC_UNCHECKE
D_TYPE_IN_GENERIC_CALL)</a></h3> |
| 792 |
| 793 |
| 794 <p> |
| 795 総称型パラメータからの特定の型が予想される Object 型をコンパイルするとき、総称型コレクションメソッドへの呼び出しは引数を渡します。 |
| 796 したがって、標準の Java 型システムも静的解析もパラメータとして渡されているオブジェクトが適切な型かどうかに関する有効な情報を提供できません。 |
| 797 </p> |
| 798 |
| 799 |
| 800 <h3><a name="HE_EQUALS_NO_HASHCODE">HE: equals メソッドは定義していますが hashCode メソッドは定義してい
ないクラス (HE_EQUALS_NO_HASHCODE)</a></h3> |
| 801 |
| 802 |
| 803 <p> |
| 804 このクラスは、<code>equals(Object)</code> メソッドをオーバーライドしていますが、<code>hashCode</code> メソッド
はオーバーライドしていません。 |
| 805 したがって、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に違反するかも
しれません。 |
| 806 </p> |
| 807 |
| 808 |
| 809 <h3><a name="HE_EQUALS_USE_HASHCODE">HE: equals メソッドを定義して Object.hashCode() を使用し
ているクラス (HE_EQUALS_USE_HASHCODE)</a></h3> |
| 810 |
| 811 |
| 812 <p> |
| 813 このクラスは、<code>equals(Object)</code> をオーバーライドしていますが、<code>hashCode</code> メソッドは <c
ode>java.lang.Object</code> から継承しています (同一性ハッシュコード (Java 仮想マシンによってオブジェクトに代入された任意の
値) を返します)。 |
| 814 したがって、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に違反するかも
しれません。 |
| 815 </p> |
| 816 <p> |
| 817 このクラスのインスタンスが HashMap/HashTable に決して代入されるだろうと思わないなら推奨される <code>hashCode</code> メ
ソッドの実装は以下のようになります。 |
| 818 </p> |
| 819 <blockquote><pre> |
| 820 public int hashCode() { |
| 821 assert false : "hashCodeが呼び出されることは想定されていません。"; |
| 822 return 42; // 適当な値 |
| 823 } |
| 824 </pre></blockquote> |
| 825 |
| 826 |
| 827 <h3><a name="HE_HASHCODE_NO_EQUALS">HE: hashCode メソッドを定義していますが equals メソッドは定義してい
ないクラス (HE_HASHCODE_NO_EQUALS)</a></h3> |
| 828 |
| 829 |
| 830 <p> |
| 831 このクラスは、<code>hashCode</code> メソッドを定義していますが、<code>equals</code> メソッドは定義していません。 |
| 832 これは「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に違反するかもしれま
せん。 |
| 833 </p> |
| 834 |
| 835 |
| 836 <h3><a name="HE_HASHCODE_USE_OBJECT_EQUALS">HE: hashCode メソッドを定義して Object.equals
() を使用しているクラス (HE_HASHCODE_USE_OBJECT_EQUALS)</a></h3> |
| 837 |
| 838 |
| 839 <p> |
| 840 このクラスは、<code>hashCode</code> メソッドを定義していますが、 <code>equals</code> メソッドは <code>java
.lang.Object</code> から継承しています (オブジェクトの参照比較で等価性を判定します)。 |
| 841 これは「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に従っているかもしれ
ませんが、 |
| 842 おそらく、<code>hashCode</code> メソッドをオーバーライドすることによって意図されたことではありません。 |
| 843 (<code>hashCode</code> メソッドをオーバーライドすることは、オブジェクトの同一性が単純な参照等価性よりも複雑な規約に基づくことを意味します
)。 |
| 844 </p> |
| 845 <p> |
| 846 このクラスのインスタンスが HashMap/HashTable に決して代入されるだろうと思わないなら推奨される <code>hashCode</code> メ
ソッドの実装は以下のようになります。 |
| 847 </p> |
| 848 <blockquote><pre> |
| 849 public int hashCode() { |
| 850 assert false : "hashCodeが呼び出されることは想定されていません。"; |
| 851 return 42; // 適当な値 |
| 852 } |
| 853 </pre></blockquote> |
| 854 |
| 855 |
| 856 <h3><a name="HE_INHERITS_EQUALS_USE_HASHCODE">HE: equals メソッドを継承して Object.hashCo
de() を使用しているクラス (HE_INHERITS_EQUALS_USE_HASHCODE)</a></h3> |
| 857 |
| 858 |
| 859 <p> |
| 860 このクラスは、抽象スーパークラスから <code>equals(Object)</code> メソッドを継承して、<code>java.lang.Object<
/code> から <code>hashCode</code> メソッドを継承しています (同一性ハッシュコード (Java 仮想マシンによってオブジェクトに代
入された任意の値) を返します)。 |
| 861 したがって、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に違反するかも
しれません。 |
| 862 </p> |
| 863 <p> |
| 864 <code>hashCode</code> メソッドを定義したくないまたはオブジェクトが HashMap/Hashtable に決して格納されないだろうと思って
いるなら <code>UnsupportedOperationException</code> をスローする <code>hashCode()</code> メ
ソッドを定義してください。 |
| 865 </p> |
| 866 |
| 867 |
| 868 <h3><a name="IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION">IC: スーパークラスは初期化中
にサブクラスを使用している (IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION)</a></h3> |
| 869 |
| 870 |
| 871 <p> |
| 872 クラスは、初期化中にサブクラスを積極的に使用しています。サブクラスはこの時点ではまだ初期化されていません。<br> |
| 873 たとえば、以下のコードにおいて、<code>foo</code> は null です。 |
| 874 </p> |
| 875 <blockquote><pre> |
| 876 public class CircularClassInitialization { |
| 877 static class InnerClassSingleton extends CircularClassInitialization { |
| 878 static InnerClassSingleton singleton = new InnerClassSingleton(); |
| 879 } |
| 880 |
| 881 static CircularClassInitialization foo = InnerClassSingleton.singleton; |
| 882 } |
| 883 </pre></blockquote> |
| 884 |
| 885 |
| 886 <h3><a name="IMSE_DONT_CATCH_IMSE">IMSE: 疑わしい IllegalMonitorStateException のキャッチ
(IMSE_DONT_CATCH_IMSE)</a></h3> |
| 887 |
| 888 |
| 889 <p> |
| 890 <code>IllegalMonitorStateException</code> は、一般に設計上の欠陥 (ロックを保持していないオブジェクトで <code>
wait</code> メソッドまたは <code>notify</code> メソッドを呼び出す) の場合にだけスローされます。 |
| 891 </p> |
| 892 |
| 893 |
| 894 <h3><a name="ISC_INSTANTIATE_STATIC_CLASS">ISC: static メソッドだけを提供するクラスの不必要なインスタンス
化 (ISC_INSTANTIATE_STATIC_CLASS)</a></h3> |
| 895 |
| 896 |
| 897 <p> |
| 898 このクラスは、static メソッドだけを提供するクラスのオブジェクトを作成しています。 |
| 899 このオブジェクトは作成する必要はありません。修飾子として直接クラス名を使用する static メソッドにアクセスしてください。 |
| 900 </p> |
| 901 |
| 902 |
| 903 <h3><a name="IT_NO_SUCH_ELEMENT">It: Iterator.next() が NoSuchElementException をス
ローできない (IT_NO_SUCH_ELEMENT)</a></h3> |
| 904 |
| 905 |
| 906 <p> |
| 907 このクラスは、<code>java.util.Iterator</code> を実装しています。 |
| 908 しかしながら、<code>next</code> メソッドは <code>java.util.NoSuchElementException</code> をスロ
ーできません。 |
| 909 <code>next</code> メソッドは、それ以上要素を返すことができないときは <code>NoSuchElementException</code>
をスローするように変更するべきです。 |
| 910 </p> |
| 911 |
| 912 |
| 913 <h3><a name="J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION">J2EE: HttpSessi
on への非直列化可能オブジェクトの格納 (J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION)</a></h
3> |
| 914 |
| 915 |
| 916 <p> |
| 917 このコードは、HttpSession に非直列化可能オブジェクトを格納していると思われます。 |
| 918 このセッションが不活性化されるか移行したなら、エラーを招きます。 |
| 919 </p> |
| 920 |
| 921 |
| 922 <h3><a name="JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS">JCIP: 不変クラスのフィールドは final
にすべき (JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS)</a></h3> |
| 923 |
| 924 |
| 925 <p> |
| 926 クラスは、net.jcip.annotations.Immutable または javax.annotation.concurrent.Immutable でア
ノテートされています。 |
| 927 アノテーションのルールは、すべてのフィールドが final であることを義務づけます。 |
| 928 </p> |
| 929 |
| 930 |
| 931 <h3><a name="NP_BOOLEAN_RETURN_NULL">NP: 戻り型が Boolean のメソッドが明示的に null を返している (NP
_BOOLEAN_RETURN_NULL)</a></h3> |
| 932 |
| 933 |
| 934 <p> |
| 935 Boolean.TRUE、Boolean.FALSE、null を返すメソッドはいつ事故が起きてもおかしくないです。 |
| 936 まるで論理型の値を返すかのように、このメソッドは呼び出される可能性があります。 |
| 937 コンパイラは Boolean 値のオートアンボクシングを挿入します。 |
| 938 null 値が返されるなら NullPointerException が発生することになります。 |
| 939 </p> |
| 940 |
| 941 |
| 942 <h3><a name="NP_CLONE_COULD_RETURN_NULL">NP: null を返すかもしれない clone メソッド (NP_CLONE
_COULD_RETURN_NULL)</a></h3> |
| 943 |
| 944 |
| 945 <p> |
| 946 この <code>clone</code> メソッドは、いくつかの条件で null を返すと思われます。 |
| 947 しかし、<code>clone</code> メソッドは決して null を返すのは許されません。 |
| 948 この経路が到達できないことを確信しているなら、代わりに <code>AssertionError</code> をスローしてください。 |
| 949 </p> |
| 950 |
| 951 |
| 952 <h3><a name="NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT">NP: equals メソッドは null の引数をチェ
ックしていない (NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT)</a></h3> |
| 953 |
| 954 |
| 955 <p> |
| 956 この <code>equals(Object)</code> メソッドの実装は引数として渡されている null をチェックしていないので、<code>java.
lang.Object.equals()</code> で定義された規約に違反しています。 |
| 957 すべての <code>equals</code> メソッドは引数に null が渡されたなら false を返すべきです。 |
| 958 </p> |
| 959 |
| 960 |
| 961 <h3><a name="NP_TOSTRING_COULD_RETURN_NULL">NP: null を返すかもしれない toString メソッド (NP
_TOSTRING_COULD_RETURN_NULL)</a></h3> |
| 962 |
| 963 |
| 964 <p> |
| 965 この <code>toString</code> メソッドは、いくつかの条件で null を返すと思われます。 |
| 966 仕様を寛大に読むとこれが許されると解釈できるかもしれませんが、それはおそらく間違った考えで、他のコードが壊れる原因になる可能性があります。 |
| 967 null ではなく空の文字列または、いくつかの他の適切な文字列を返してください。 |
| 968 </p> |
| 969 |
| 970 |
| 971 <h3><a name="NM_CLASS_NAMING_CONVENTION">Nm: クラス名は大文字から始めるべき (NM_CLASS_NAMING_CO
NVENTION)</a></h3> |
| 972 |
| 973 |
| 974 <p> |
| 975 クラス名は、最初の文字とそれに続く各単語の最初の文字を大文字にした名詞にすべきです。 |
| 976 クラス名は単純でわかりやすいようにしてください。 |
| 977 頭文字や略語 (URLやHTMLなどのように略語がロング形式よりもはるかに広く使われている場合を除く) の使用は避けてください。 |
| 978 </p> |
| 979 |
| 980 |
| 981 <h3><a name="NM_CLASS_NOT_EXCEPTION">Nm: 例外クラスのように命名されているが、クラスは Exception から派生され
ていない (NM_CLASS_NOT_EXCEPTION)</a></h3> |
| 982 |
| 983 |
| 984 <p> |
| 985 このクラスは、例外クラスから派生されていないのにクラス名が「Exception」で終わっています。 |
| 986 これは、このクラスのユーザに紛らわしいです。 |
| 987 </p> |
| 988 |
| 989 |
| 990 <h3><a name="NM_CONFUSING">Nm: 紛らわしい名前のメソッド (NM_CONFUSING)</a></h3> |
| 991 |
| 992 |
| 993 <p> |
| 994 参照されたメソッドは、大文字の使い方だけによって異なる名前があります。 |
| 995 </p> |
| 996 |
| 997 |
| 998 <h3><a name="NM_FIELD_NAMING_CONVENTION">Nm: フィールド名は小文字から始めるべき (NM_FIELD_NAMING_
CONVENTION)</a></h3> |
| 999 |
| 1000 |
| 1001 <p> |
| 1002 final でないフィールドの名前は、最初の文字は小文字にし、それに続く各単語の最初の文字を大文字にすべきです。 |
| 1003 </p> |
| 1004 |
| 1005 |
| 1006 <h3><a name="NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER">Nm: Java の後のバージョンのキーワードである識別子
を使用している (NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER)</a></h3> |
| 1007 |
| 1008 |
| 1009 <p> |
| 1010 識別子は、Java の後のバージョンのキーワードとして予約されている単語です。 |
| 1011 コードを Java の後のバージョンでコンパイルするためには変更する必要があります。 |
| 1012 </p> |
| 1013 |
| 1014 |
| 1015 <h3><a name="NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER">Nm: Java の後のバージョンのキーワー
ドである識別子を使用している (NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER)</a></h3> |
| 1016 |
| 1017 |
| 1018 <p> |
| 1019 この識別子は、Java の後のバージョンのキーワードとして使われます。 |
| 1020 このコードと API を参照するどんなコードも、Java の後のバージョンでコンパイルするためには変更する必要があります。 |
| 1021 </p> |
| 1022 |
| 1023 |
| 1024 <h3><a name="NM_METHOD_NAMING_CONVENTION">Nm: メソッド名は小文字から始めるべきです (NM_METHOD_NAMI
NG_CONVENTION)</a></h3> |
| 1025 |
| 1026 |
| 1027 <p> |
| 1028 メソッド名は、最初の文字は小文字にし、それに続く各単語の最初の文字を大文字にした動詞にすべきです。 |
| 1029 </p> |
| 1030 |
| 1031 |
| 1032 <h3><a name="NM_SAME_SIMPLE_NAME_AS_INTERFACE">Nm: クラス名は実装されたインタフェースの単純名を遮るべきではな
い (NM_SAME_SIMPLE_NAME_AS_INTERFACE)</a></h3> |
| 1033 |
| 1034 |
| 1035 <p> |
| 1036 このクラスまたはインタフェースは、、インタフェースが異なるパッケージであるということを除いて実装された/拡張されたインタフェースと同一の単純名です (たとえば、
<code>alpha.Foo</code> が <code>beta.Foo</code> を継承しているような状況です)。 |
| 1037 これは非常に紛らわしく、参照関係を解決するために import 文を見なければならなかったり、スーパークラスに存在するメソッドを誤ってオーバーライドしてしまった
りする状況を作り出します。 |
| 1038 </p> |
| 1039 |
| 1040 |
| 1041 <h3><a name="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS">Nm: クラス名はスーパークラスの単純名を遮るべきではない (N
M_SAME_SIMPLE_NAME_AS_SUPERCLASS)</a></h3> |
| 1042 |
| 1043 |
| 1044 <p> |
| 1045 このクラスは、スーパークラスが異なるパッケージであるということを除いて、スーパークラスと同一の単純名をです (たとえば、<code>alpha.Foo</cod
e> が <code>beta.Foo</code> を拡張します)。 |
| 1046 これは非常に紛らわしく、参照関係を解決するために import 文を見なければならなかったり、スーパークラスに存在するメソッドを誤ってオーバーライドしてしまった
りする状況を作り出します。 |
| 1047 </p> |
| 1048 |
| 1049 |
| 1050 <h3><a name="NM_VERY_CONFUSING_INTENTIONAL">Nm: 非常に紛らわしい名前のメソッド (多分意図的) (NM_VERY
_CONFUSING_INTENTIONAL)</a></h3> |
| 1051 |
| 1052 |
| 1053 <p> |
| 1054 参照されたメソッドは、大文字の使い方だけによって異なる名前があります。 |
| 1055 大文字の使い方が同一ならメソッドの1つが他のメソッドをオーバーライドするので、非常に紛らわしいです。 |
| 1056 他のメソッドの存在から、これらのメソッドの両方の存在が意図的で、確実に混乱させていると思われます。 |
| 1057 APIの凍結によって両方とも持たざるを得ない場合を除き、それらのうちの1つを削除しようと努力するべきです。 |
| 1058 </p> |
| 1059 |
| 1060 |
| 1061 <h3><a name="NM_WRONG_PACKAGE_INTENTIONAL">Nm: パラメータの間違ったパッケージのためにスーパークラスのメソッドをオ
ーバーライドしていないメソッド (NM_WRONG_PACKAGE_INTENTIONAL)</a></h3> |
| 1062 |
| 1063 |
| 1064 <p> |
| 1065 パラメータの型が正確にスーパークラスで対応するパラメータの型と合致していないので、サブクラスのメソッドはスーパークラスの類似したメソッドをオーバーライドしていま
せん。<br> |
| 1066 たとえば以下のようなコードです。 |
| 1067 </p> |
| 1068 <blockquote><pre> |
| 1069 import alpha.Foo; |
| 1070 |
| 1071 public class A { |
| 1072 public int f(Foo x) { return 17; } |
| 1073 } |
| 1074 ---- |
| 1075 import beta.Foo; |
| 1076 |
| 1077 public class B extends A { |
| 1078 public int f(Foo x) { return 42; } |
| 1079 public int f(alpha.Foo x) { return 27; } |
| 1080 } |
| 1081 </pre></blockquote> |
| 1082 <p> |
| 1083 クラス <code>B</code> で定義された <code>f(Foo)</code> メソッドは、クラス <code>A</code> の <code>f
(Foo)</code> メソッドをオーバーライドしません。 |
| 1084 これは引数の型 <code>Foo</code> が違うパッケージだからです。 |
| 1085 </p> |
| 1086 <p> |
| 1087 この場合、サブクラスがスーパークラスのメソッドと同一のシグネチャでメソッドを定義しているので、おそらく理解できます。 |
| 1088 しかしながら、そのようなメソッドは非常に紛らわしいです。 |
| 1089 類似しているが同一ではないシグネチャのメソッドを除去するか、非推奨にすることを強く検討するべきです。 |
| 1090 </p> |
| 1091 |
| 1092 |
| 1093 <h3><a name="ODR_OPEN_DATABASE_RESOURCE">ODR: データベースリソースのクローズに失敗するかもしれないメソッド (OD
R_OPEN_DATABASE_RESOURCE)</a></h3> |
| 1094 |
| 1095 |
| 1096 <p> |
| 1097 このメソッドは、データベースリソース (たとえば、データベースコネクションや行セット) を作成していますが、どんなフィールドにも代入していないか、他のメソッドに
も渡していないか、戻り値にもしていません。 |
| 1098 そして、メソッドからのすべての経路でオブジェクトをクローズするように見えません。 |
| 1099 メソッドからのすべての経路でデータベースリソースのクローズ失敗は良くない性能になるかもしれません。 |
| 1100 データベースとの通信で問題があるアプリケーションの原因になる可能性があります。 |
| 1101 </p> |
| 1102 |
| 1103 |
| 1104 <h3><a name="ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH">ODR: 例外経路でデータベースリソースのクロー
ズに失敗するかもしれないメソッド (ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH)</a></h3> |
| 1105 |
| 1106 |
| 1107 <p> |
| 1108 このメソッドは、データベースリソース (たとえば、データベースコネクションや行セット) を作成していますが、どんなフィールドにも代入していないか、他のメソッドに
も渡していないか、戻り値にもしていません。 |
| 1109 そして、メソッドからのすべての例外経路でオブジェクトをクローズするように見えません。 |
| 1110 メソッドからのすべての経路でデータベースリソースのクローズ失敗は良くない性能になるかもしれません。 |
| 1111 データベースとの通信で問題があるアプリケーションの原因になる可能性があります。 |
| 1112 </p> |
| 1113 |
| 1114 |
| 1115 <h3><a name="OS_OPEN_STREAM">OS: ストリームのクローズに失敗するかもしれないメソッド (OS_OPEN_STREAM)</a><
/h3> |
| 1116 |
| 1117 |
| 1118 <p> |
| 1119 このメソッドは、入出力ストリームオブジェクトを作成していますが、どんなフィールドにも代入していないしクローズするかもしれない別のメソッドにも渡していなくて、戻り
値にしてもいません。そして、メソッドからのすべての経路でクローズするように見えません。 |
| 1120 これは、ファイルディスクリプタリークになるかもしれません。 |
| 1121 ストリームがクローズされることを確実にするために <code>finally</code> ブロックを使うことは、一般に良い考えです。 |
| 1122 </p> |
| 1123 |
| 1124 |
| 1125 <h3><a name="OS_OPEN_STREAM_EXCEPTION_PATH">OS: 例外経路でストリームのクローズに失敗するかもしれないメソッド (
OS_OPEN_STREAM_EXCEPTION_PATH)</a></h3> |
| 1126 |
| 1127 |
| 1128 <p> |
| 1129 このメソッドは、入出力ストリームオブジェクトを作成していますが、どんなフィールドにも代入していないしクローズするかもしれない別のメソッドにも渡していないくて、戻
り値にしてもいません。そして、メソッドからのすべての可能性がある例外経路でクローズするように見えません。 |
| 1130 これはファイルディスクリプターリークになるかもしれません。 |
| 1131 ストリームがクローズされることを確実にするために <code>finally</code> ブロックを使うことは、一般に良い考えです。 |
| 1132 </p> |
| 1133 |
| 1134 |
| 1135 <h3><a name="PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS">PZ: 繰り返しでエントリオブジェクトを再利用しな
い (PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS)</a></h3> |
| 1136 |
| 1137 |
| 1138 <p> |
| 1139 このクラスは、Iterator と Map.Entry で基底 Map のビューを返すことを許可された両方の entrySet メソッドがあります。 |
| 1140 この巧妙なアイデアは、Map 実装で使用されましたが、厄介なコーディング間違いの可能性を取り込みました。 |
| 1141 Map <code>m</code> が entrySet のためのそのような反復子を返すならば、<code>c.addAll(m.entrySet())</c
ode> はひどく間違っているでしょう。 |
| 1142 OpenJDK 1.7 の すべての Map 実装はこれを回避するために書き直されました。 |
| 1143 </p> |
| 1144 |
| 1145 |
| 1146 <h3><a name="RC_REF_COMPARISON_BAD_PRACTICE">RC: 定数への疑わしい参照比較 (RC_REF_COMPARISON
_BAD_PRACTICE)</a></h3> |
| 1147 |
| 1148 |
| 1149 <p> |
| 1150 このメソッドは、 参照値を == または != 演算子を使用して定数と比較しています。 |
| 1151 この型のインスタンスを比較する正しい方法は、一般に <code>equals</code> メソッドです。 |
| 1152 等価で識別可能なインスタンスを作成する可能性がありますが異なるオブジェクトなので == で比較しないでください。 |
| 1153 参照によって一般に比較されるべきではないクラスの例は、<code>java.lang.Integer</code> 、<code>java.lang.Float
</code> などです。 |
| 1154 </p> |
| 1155 |
| 1156 |
| 1157 <h3><a name="RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN">RC: Boolean 値の疑わしい参照比較 (RC_
REF_COMPARISON_BAD_PRACTICE_BOOLEAN)</a></h3> |
| 1158 |
| 1159 |
| 1160 <p> |
| 1161 このメソッドは、== または != 演算子を使用して2つの Boolean 値を比較しています。 |
| 1162 一般には2つの Boolean 値 (<code>Boolean.TRUE</code> と <code>Boolean.FALSE</code>) だけですが
、 |
| 1163 <code>new Boolean(b)</code> コンストラクタを使用して他の Boolean オブジェクトを作成する可能性があります。 |
| 1164 そのようなオブジェクトを回避することは最高です。 |
| 1165 しかし、それらが存在するなら、Boolean オブジェクトの等価性をチェックするために <code>.equals(...)</code> ではなく == また
は != を使用しているなら異なる結果をもたらします。 |
| 1166 </p> |
| 1167 |
| 1168 |
| 1169 <h3><a name="RR_NOT_CHECKED">RR: InputStream.read() の戻り値を無視しているメソッド (RR_NOT_CHEC
KED)</a></h3> |
| 1170 |
| 1171 |
| 1172 <p> |
| 1173 このメソッドは、複数バイトを返す可能性がある <code>java.io.InputStream.read()</code> (またはそのバリエーション) の戻
り値を無視しています。 |
| 1174 戻り値がチェックされないと呼び出し元は要求したバイト数よりも少ないバイト数を読み出した場合、正しく処理できません。 |
| 1175 これは潜在的なバグで、多くのプログラムでは、入力ストリームからの読み出しは、通常要求した完全なデータ量を読み出しますが、散発的に失敗することがあります。 |
| 1176 </p> |
| 1177 |
| 1178 |
| 1179 <h3><a name="SR_NOT_CHECKED">RR: InputStream.skip() の戻り値を無視しているメソッド (SR_NOT_CHEC
KED)</a></h3> |
| 1180 |
| 1181 |
| 1182 <p> |
| 1183 このメソッドは、複数バイトをスキップする可能性がある <code>java.io.InputStream.skip()</code> の戻り値を無視しています。 |
| 1184 戻り値がチェックされないと呼び出し元は要求したバイト数よりも少ないバイト数しかスキップしなかった場合、正しく処理できません。 |
| 1185 これは潜在的なバグで、多くのプログラムでは、入力ストリームからのスキップは、通常要求した完全なデータ量をスキップをしますが、散発的に失敗することがあります。 |
| 1186 しかしながら、バッファードストリーム での <code>skip</code> メソッドはバッファのデータをスキップするので要求されたバイト数のスキップは常に失
敗します。 |
| 1187 </p> |
| 1188 |
| 1189 |
| 1190 <h3><a name="RV_NEGATING_RESULT_OF_COMPARETO">RV: compareTo()/compare() の結果を無効にす
る (RV_NEGATING_RESULT_OF_COMPARETO)</a></h3> |
| 1191 |
| 1192 |
| 1193 <p> |
| 1194 このコードは、<code>compareTo</code> または <code>compare</code> メソッドの戻り値を無効にしています。 |
| 1195 これは疑わしいか間違ったプログラミングプラクティスです。戻り値が Integer.MIN_VALUE なので、戻り値を無効にすることは結果の符号を無効にしません
。 |
| 1196 結果を無効にするのではなくオペランドの順序を逆にすることによって、同じ意図した結果を得ることができます。 |
| 1197 </p> |
| 1198 |
| 1199 |
| 1200 <h3><a name="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE">RV: 例外的戻り値を無視しているメソッド (RV_RET
URN_VALUE_IGNORED_BAD_PRACTICE)</a></h3> |
| 1201 |
| 1202 |
| 1203 <p> |
| 1204 このメソッドはチェックされていない値を返しています。 |
| 1205 戻り値は異常か予想外の実行結果を示す可能性があるのでチェックするべきです。 |
| 1206 たとえば、<code>File.delete()</code> はファイルをうまく削除できなかったなら、例外をスローするのではなく false を返します。 |
| 1207 結果をチェックしないなら例外的戻り値を返すメソッドの呼び出しで予想外の振る舞いの合図に気づきません。 |
| 1208 </p> |
| 1209 |
| 1210 |
| 1211 <h3><a name="SI_INSTANCE_BEFORE_FINALS_ASSIGNED">SI: スタティックイニシャライザは、すべての static
final フィールドが代入される前にインスタンスを作成する (SI_INSTANCE_BEFORE_FINALS_ASSIGNED)</a></h3> |
| 1212 |
| 1213 |
| 1214 <p> |
| 1215 すべての static final フィールドが初期化される前に、スタティックイニシャライザがクラスのインスタンスを作成します。 |
| 1216 </p> |
| 1217 |
| 1218 |
| 1219 <h3><a name="SW_SWING_METHODS_INVOKED_IN_SWING_THREAD">SW: Swing メソッドは AWT イベントデ
ィスパッチスレッドから呼び出す必要がある (SW_SWING_METHODS_INVOKED_IN_SWING_THREAD)</a></h3> |
| 1220 |
| 1221 |
| 1222 <p> |
| 1223 (<a href="http://web.archive.org/web/20090526170426/http://java.sun.com/develope
r/JDCTechTips/2003/tt1208.html">From JDC Tech Tip</a>)<br> |
| 1224 に解説されているとおり、Swing のメソッド、<code>show</code> メソッド、<code>setVisible</code> メソッド、<cod
e>pack</code> メソッドは、フレームのために関連したピアを作成します。 |
| 1225 ピアの作成で、システムはイベントディスパッチスレッドを作成します。 |
| 1226 これが問題になることがあります。なぜなら <code>pack</code> メソッドと <code>validate</code> メソッドがまだ処理中でもイ
ベントディスパッチスレッドがリスナに通知できるからです。 |
| 1227 この状況は、2つのスレッドが Swing コンポーネントにアクセスする可能性があり、デッドロックや、その他のスレッドに関する問題になる可能性がある重大な欠陥です
。 |
| 1228 <code>pack</code> メソッドの呼び出しはコンポーネントを実体化させます。実体化しているときに、イベントディスパッチスレッドがリスナへの通知を開始
する可能性があります。 |
| 1229 </p> |
| 1230 |
| 1231 |
| 1232 <h3><a name="SE_BAD_FIELD">Se: 直列化可能クラスの非 transient で非直列化可能なインスタンスフィールド (SE_BAD_
FIELD)</a></h3> |
| 1233 |
| 1234 |
| 1235 <p> |
| 1236 この直列化可能クラスは、transient、Serializable、<code>java.lang.Object</code> でもない非プリミティブ型のイン
スタンスフィールドを定義して、 |
| 1237 <code>Externalizable</code> インタフェースまたは <code>readObject</code> メソッドと <code>write
Object</code> メソッドを実装するように見えません。 |
| 1238 また、<code>Externalizable</code> インタフェースも実装していなくて、<code>readObject</code> メソッドも <c
ode>writeObject</code> メソッドも定義していません。 |
| 1239 非直列化可能オブジェクトがこのフィールドに格納されるならクラスのオブジェクトは正しく直列化復元されません。 |
| 1240 </p> |
| 1241 |
| 1242 |
| 1243 <h3><a name="SE_BAD_FIELD_INNER_CLASS">Se: 非直列化可能クラスに直列化可能な内部クラスがある (SE_BAD_FIEL
D_INNER_CLASS)</a></h3> |
| 1244 |
| 1245 |
| 1246 <p> |
| 1247 この直列化可能クラスは、非直列化可能クラスの内部クラスです。 |
| 1248 内部クラスを直列化しようとすると関連する外部クラスのインスタンスを結びつけようとするので、実行時エラーの原因になります。 |
| 1249 </p> |
| 1250 <p> |
| 1251 できれば、内部クラスを static にして問題を解決するべきです。 |
| 1252 外部クラスを直列化可能にすることで動作するかもしれないが、内部クラスのインスタンスを直列化することは外部クラスも常に直列化することを意味します。 |
| 1253 本当に望むことですか。 |
| 1254 </p> |
| 1255 |
| 1256 |
| 1257 <h3><a name="SE_BAD_FIELD_STORE">Se: 非直列化可能な値を直列化可能クラスのインスタンスフィールドに格納している (SE_BA
D_FIELD_STORE)</a></h3> |
| 1258 |
| 1259 |
| 1260 <p> |
| 1261 非直列化可能な値を直列化可能クラスの 非 transient フィールドに格納しています。 |
| 1262 </p> |
| 1263 |
| 1264 |
| 1265 <h3><a name="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE">Se: Comparator は Serializable
を実装していない (SE_COMPARATOR_SHOULD_BE_SERIALIZABLE)</a></h3> |
| 1266 |
| 1267 |
| 1268 <p> |
| 1269 このクラスは <code>Comparator</code> インタフェースを実装しています。 |
| 1270 <code>Serializable</code> インタフェースも実装するべきかどうか検討するべきです。 |
| 1271 コンパレータが <code>TreeMap</code> のような順序付きコレクションを構築するために使われるなら、コンパレータが直列化可能な場合だけ、<cod
e>TreeMap</code> は直列化可能です。 |
| 1272 大部分のコンパレータがほとんど状態を持たないとしても直列化可能にすることは簡単で良い防衛的なプログラミングです。 |
| 1273 </p> |
| 1274 |
| 1275 |
| 1276 <h3><a name="SE_INNER_CLASS">Se: 直列化可能な内部クラス (SE_INNER_CLASS)</a></h3> |
| 1277 |
| 1278 |
| 1279 <p> |
| 1280 この直列化可能なクラスは内部クラスです。内部クラスを直列化しようとすると関連した外部クラスのインスタンスも直列化します。 |
| 1281 外部クラスのインスタンスは直列化可能なので失敗しませんが、意図したことよりもっとずっと多くのデータを直列化するかもしれません。 |
| 1282 できれば、内部クラスを static にして問題を解決するべきです。 |
| 1283 </p> |
| 1284 |
| 1285 |
| 1286 <h3><a name="SE_NONFINAL_SERIALVERSIONID">Se: serialVersionUID が final ではない (SE_
NONFINAL_SERIALVERSIONID)</a></h3> |
| 1287 |
| 1288 |
| 1289 <p> |
| 1290 このクラスは、final でない <code>serialVersionUID</code> フィールドを定義しています。 |
| 1291 直列化を目的としてバージョン UID を指定することを意図しているならフィールドは final とすべきです。 |
| 1292 </p> |
| 1293 |
| 1294 |
| 1295 <h3><a name="SE_NONLONG_SERIALVERSIONID">Se: serialVersionUID が long ではない (SE_NO
NLONG_SERIALVERSIONID)</a></h3> |
| 1296 |
| 1297 |
| 1298 <p> |
| 1299 このクラスは、long でない <code>serialVersionUID</code> フィールドを定義しています。 |
| 1300 直列化を目的としてバージョン UID を指定することを意図しているならフィールドは long とすべきです。 |
| 1301 </p> |
| 1302 |
| 1303 |
| 1304 <h3><a name="SE_NONSTATIC_SERIALVERSIONID">Se: serialVersionUID が static ではない (S
E_NONSTATIC_SERIALVERSIONID)</a></h3> |
| 1305 |
| 1306 |
| 1307 <p> |
| 1308 このクラスは、static でない <code>serialVersionUID</code> フィールドを定義しています。 |
| 1309 直列化を目的としてバージョン UID を指定することを意図しているならフィールドは static とすべきです。 |
| 1310 </p> |
| 1311 |
| 1312 |
| 1313 <h3><a name="SE_NO_SUITABLE_CONSTRUCTOR">Se: Serializable なクラスのスーパークラスで、引数なしコンスト
ラクタを定義していない (SE_NO_SUITABLE_CONSTRUCTOR)</a></h3> |
| 1314 |
| 1315 |
| 1316 <p> |
| 1317 このクラスは <code>Serializable</code> インタフェースを実装していますが、そのスーパークラスは実装していません。 |
| 1318 そのようなオブジェクトが直列化復元されるとき、スーパークラスのフィールドはスーパークラスの引数なしコンストラクタを呼び出すことによって初期化される必要があります
。 |
| 1319 スーパークラスには引数なしコンストラクタがないので、直列化と直列化復元は実行時に失敗します。 |
| 1320 </p> |
| 1321 |
| 1322 |
| 1323 <h3><a name="SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION">Se: Externalizable
なクラスが引数なしコンストラクタを定義していない (SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION)</a></h
3> |
| 1324 |
| 1325 |
| 1326 <p> |
| 1327 このクラスは、<code>Externalizable</code> インタフェースを実装していますが、引数なしコンストラクタを定義していません。 |
| 1328 <code>Externalizable</code> オブジェクトが直列化復元されるときは、最初に引数なしコンストラクタを呼び出すことによって構築される必要が
あります。 |
| 1329 このクラスには引数なしコンストラクタがないので、直列化と直列化復元は実行時に失敗します。 |
| 1330 </p> |
| 1331 |
| 1332 |
| 1333 <h3><a name="SE_READ_RESOLVE_MUST_RETURN_OBJECT">Se: readResolve メソッドの戻り値の型が Obj
ect で宣言されていない (SE_READ_RESOLVE_MUST_RETURN_OBJECT)</a></h3> |
| 1334 |
| 1335 |
| 1336 <p> |
| 1337 <code>readResolve</code> メソッドが直列化機構で認識されるためには戻り値の型が <code>Object</code> で宣言されなけれ
ばなりません。 |
| 1338 </p> |
| 1339 |
| 1340 |
| 1341 <h3><a name="SE_TRANSIENT_FIELD_NOT_RESTORED">Se: 直列化復元によって設定されない transient フィール
ド (SE_TRANSIENT_FIELD_NOT_RESTORED)</a></h3> |
| 1342 |
| 1343 |
| 1344 <p> |
| 1345 このクラスには複数の場所で更新されるフィールドがあります。したがって、このクラスの状態の一部であると思われます。 |
| 1346 しかしながら、フィールドは transient と宣言しているので、 readObject/readResolve で値が設定されません。 |
| 1347 クラスの直列化復元されたインスタンスにはデフォルト値が設定されます。 |
| 1348 </p> |
| 1349 |
| 1350 |
| 1351 <h3><a name="SE_NO_SERIALVERSIONID">SnVI: Serializable なクラスが serialVersionUID を定
義していない (SE_NO_SERIALVERSIONID)</a></h3> |
| 1352 |
| 1353 |
| 1354 <p> |
| 1355 このクラスは <code>Serializable</code> インタフェースを実装していますが、<code>serialVersionUID</code>
フィールドを定義していません。 |
| 1356 .class オブジェクトへの参照を追加するのと同じくらい簡単な変更でクラスに合成フィールドを追加します。 |
| 1357 それは、残念ながら暗黙の <code>serialVersionUID</code> を変えます (たとえば、<code>String.class</code>
への参照を追加すると、<code>class$java$lang$String</code> という static フィールドを生成します)。 |
| 1358 また、バイトコードコンパイラへの異なるソースコードは、クラスオブジェクトまたは内部クラスに参照のために生成される合成変数のために異なる命名規則を使用するかもしれ
ません。 |
| 1359 バージョンを横断する Serializable の相互運用性を保証するために、明示的に、serialVersionUID を追加することを検討してください。 |
| 1360 </p> |
| 1361 |
| 1362 |
| 1363 <h3><a name="UI_INHERITANCE_UNSAFE_GETRESOURCE">UI: クラスが拡張されるなら getResource の使い方
は安全ではないかもしれない (UI_INHERITANCE_UNSAFE_GETRESOURCE)</a></h3> |
| 1364 |
| 1365 |
| 1366 <p> |
| 1367 このクラスが別のパッケージによって拡張されるなら、<code>this.getClass().getResource(...)</code> の呼び出しは予想外
の結果をもたらす可能性があります。 |
| 1368 </p> |
| 1369 |
| 1370 |
| 1371 <h3><a name="BC_IMPOSSIBLE_CAST">BC: 不可能なキャスト (BC_IMPOSSIBLE_CAST)</a></h3> |
| 1372 |
| 1373 |
| 1374 <p> |
| 1375 このキャストは、常に ClassCastException をスローします。 |
| 1376 FindBugs は、instanceof チェックから型情報を調査して、メソッドからの戻り値とフィールドからロードされた値の型について、より多くの正確な情報を
使用します。 |
| 1377 したがって、宣言された変数の型にはより多くの正確な情報があるかもしれないしれません。 |
| 1378 そして、キャストが常に実行時例外をスローするのか判定するために使用する可能性があります。 |
| 1379 </p> |
| 1380 |
| 1381 |
| 1382 <h3><a name="BC_IMPOSSIBLE_DOWNCAST">BC: 不可能なダウンキャスト (BC_IMPOSSIBLE_DOWNCAST)</a
></h3> |
| 1383 |
| 1384 |
| 1385 <p> |
| 1386 このキャストは、常に ClassCastException をスローします。 |
| 1387 解析はキャストしている値の正確な型がわかっていると信じています。 |
| 1388 そして、サブタイプへダウンキャストしようとする試みは、ClassCastException のスローによって常に失敗します。 |
| 1389 </p> |
| 1390 |
| 1391 |
| 1392 <h3><a name="BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY">BC: toArray メソッドの結果の不可能なダウンキャスト
(BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY)</a></h3> |
| 1393 |
| 1394 |
| 1395 <p> |
| 1396 このコードは、以下のように、<code>Object[]</code> より特定の型のコレクションで <code>toArray</code> メソッドを呼び出
す結果をキャストしています。 |
| 1397 </p> |
| 1398 <blockquote><pre> |
| 1399 String[] getAsArray(Collection<String> c) { |
| 1400 return (String[]) c.toArray(); |
| 1401 } |
| 1402 </pre></blockquote> |
| 1403 <p> |
| 1404 これは通常、ClassCastException をスローして失敗します。 |
| 1405 ほとんどすべてのコレクションの <code>toArray</code> メソッドは、<code>Object[]</code> を返します。 |
| 1406 Collection オブジェクトは宣言された総称型コレクションの参照がないので、本当に何もできません。 |
| 1407 コレクションから特定の型の配列を得る正しい方法は、<code>c.toArray(new String[]);</code> または <code>c.toArr
ay(new String[c.size()]);</code> (後者はわずかにより効率的です) を使うことです。 |
| 1408 これに対する1つの共通の知られている例外があります。 |
| 1409 <code>Arrays.asList(...)</code>によって返されるリストの <code>toArray()</code> メソッドは、共変な配列を返
します。 |
| 1410 たとえば、<code>Arrays.asArray(new String[] { "a" }).toArray()</code> は <code>String
[]</code> を返します。 |
| 1411 FindBugs はそのようなケースを検出して抑止しようとしますが、いくつか見落とすかもしれません。 |
| 1412 </p> |
| 1413 |
| 1414 |
| 1415 <h3><a name="BC_IMPOSSIBLE_INSTANCEOF">BC: 常に false を返す instanceof (BC_IMPOSSIBL
E_INSTANCEOF)</a></h3> |
| 1416 |
| 1417 |
| 1418 <p> |
| 1419 この instanceof は常に false を返します。これは安全で、誤解や論理エラーを指摘していないことを確認してください。 |
| 1420 </p> |
| 1421 |
| 1422 |
| 1423 <h3><a name="BIT_ADD_OF_SIGNED_BYTE">BIT: 符号付きバイト値のビット加算 (BIT_ADD_OF_SIGNED_BYTE
)</a></h3> |
| 1424 |
| 1425 |
| 1426 <p> |
| 1427 バイト値と明らかに下位8ビットがあるとわかっている値を加算しています。 |
| 1428 ビット演算を実行する前にバイト配列からロードされた値は32ビットまで符号拡張されます。 |
| 1429 したがって、<code>b[0]</code> の値が <code>0xff</code> で、<code>x</code> の初期値が <code>0</co
de> だとすると、 |
| 1430 <code>((x << 8) + b[0])</code> は、<code>0xff</code> が符号拡張で <code>0xffffffff
</code> になるので、結果として <code>0xffffffff</code> が得られます。 |
| 1431 </p> |
| 1432 <p> |
| 1433 特に、バイト配列 int にパックする以下のようなコードはひどく間違っています。 |
| 1434 </p> |
| 1435 <blockquote><pre> |
| 1436 int result = 0; |
| 1437 for(int i = 0; i < 4; i++) |
| 1438 result = ((result << 8) + b[i]); |
| 1439 </pre></blockquote> |
| 1440 <p> |
| 1441 その代わりに以下のようなイディオムは動作します。 |
| 1442 </p> |
| 1443 <blockquote><pre> |
| 1444 int result = 0; |
| 1445 for(int i = 0; i < 4; i++) |
| 1446 result = ((result << 8) + (b[i] & 0xff)); |
| 1447 </pre></blockquote> |
| 1448 |
| 1449 |
| 1450 <h3><a name="BIT_AND">BIT: 互換性のないビットマスク (BIT_AND)</a></h3> |
| 1451 |
| 1452 |
| 1453 <p> |
| 1454 このメソッドは、<i>(e & C)</i> 形式の式を <i>D</i> と比較しています。 |
| 1455 定数 <i>C</i> と <i>D</i> の特定の値と常に等しくないことを比較します。論理エラーかタイプミスかもしれません。 |
| 1456 </p> |
| 1457 |
| 1458 |
| 1459 <h3><a name="BIT_AND_ZZ">BIT: ((...) & 0) == 0 なのか確かめている (BIT_AND_ZZ)</a></h3> |
| 1460 |
| 1461 |
| 1462 <p> |
| 1463 このメソッドは、<i>(e & 0)</i> 形式の式を0と比較しています。それは、常に等価であることを比較します。論理エラーかタイプミスかもしれません
。 |
| 1464 </p> |
| 1465 |
| 1466 |
| 1467 <h3><a name="BIT_IOR">BIT: 互換性のないビットマスク (BIT_IOR)</a></h3> |
| 1468 |
| 1469 |
| 1470 <p> |
| 1471 このメソッドは、<code>(e | C)</code> 形式の式を <code>D</code> と比較しています。 |
| 1472 定数 <i>C</i> と <i>D</i> の特定の値と常に等しくないことを比較します。論理エラーかタイプミスかもしれません。 |
| 1473 </p> |
| 1474 <p> |
| 1475 典型的に、このバグは、ビットセットで帰属関係のテストを実行したいコードで発生します。 |
| 1476 しかし、ビット論理積演算子 ("&") の代わりにビット論理和演算子 ("|") を使用しています。 |
| 1477 </p> |
| 1478 |
| 1479 |
| 1480 <h3><a name="BIT_IOR_OF_SIGNED_BYTE">BIT: 符号付きバイト値のビット論理和 (BIT_IOR_OF_SIGNED_BYT
E)</a></h3> |
| 1481 |
| 1482 |
| 1483 <p> |
| 1484 ロードしたバイト値 (たとえば、バイト配列からロードされた値や戻り値がバイト型のメソッドから返された値) とビット論理和を実行しています。 |
| 1485 ビット演算を実行する前にバイト値は32ビットまで符号拡張されます。 |
| 1486 したがって、<code>b[0]</code> の値が <code>0xff</code> で、<code>x</code> の初期値が <code>0</co
de> だとすると、 |
| 1487 <code>((x << 8) | b[0])</code> は、<code>0xff</code> が符号拡張で <code>0xffffffff
</code> になるので、結果として <code>0xffffffff</code> が得られます。 |
| 1488 </p> |
| 1489 <p> |
| 1490 特に、バイト配列 int にパックする以下のようなコードはひどく間違っています。 |
| 1491 </p> |
| 1492 <blockquote><pre> |
| 1493 int result = 0; |
| 1494 for(int i = 0; i < 4; i++) { |
| 1495 result = ((result << 8) | b[i]); |
| 1496 } |
| 1497 </pre></blockquote> |
| 1498 <p> |
| 1499 その代わりに以下のようなイディオムは動作します。 |
| 1500 </p> |
| 1501 <blockquote><pre> |
| 1502 int result = 0; |
| 1503 for(int i = 0; i < 4; i++) { |
| 1504 result = ((result << 8) | (b[i] & 0xff)); |
| 1505 } |
| 1506 </pre></blockquote> |
| 1507 |
| 1508 |
| 1509 <h3><a name="BIT_SIGNED_CHECK_HIGH_BIT">BIT: ビット演算の符号をチェックする (BIT_SIGNED_CHECK_H
IGH_BIT)</a></h3> |
| 1510 |
| 1511 |
| 1512 <p> |
| 1513 このメソッドは、<code>((event.detail & SWT.SELECTED) > 0)</code> のような式を比較しています。 |
| 1514 ビット演算をより大きい演算子で比較することは、予想外の結果 (もちろん、<code>SWT.SELECTED</code> の値による) の原因になる可能性があ
ります。 |
| 1515 <code>SWT.SELECTED</code> が負数であるなら、これはバグの候補です。 |
| 1516 <code>SWT.SELECTED</code> が負ではないとしても、'> 0' の代わりに '!= 0' を使うことは良いプラクティスと思われます。 |
| 1517 </p> |
| 1518 <p> |
| 1519 Boris Bokowski |
| 1520 </p> |
| 1521 |
| 1522 |
| 1523 <h3><a name="BOA_BADLY_OVERRIDDEN_ADAPTER">BOA: スーパークラスの Adapter で実装されるメソッドを誤ってオ
ーバーライドしているクラス (BOA_BADLY_OVERRIDDEN_ADAPTER)</a></h3> |
| 1524 |
| 1525 |
| 1526 <p> |
| 1527 このメソッドは、スーパークラスで実装されているメソッドをオーバーライドしています。 |
| 1528 スーパークラスは、java.awt.event や javax.swing.event パッケージで定義されているリスナを実装する Adapter です。 |
| 1529 その結果、イベントが発生するときこのメソッドは呼び出されません。 |
| 1530 </p> |
| 1531 |
| 1532 |
| 1533 <h3><a name="ICAST_BAD_SHIFT_AMOUNT">BSHIFT: 32ビット int の-31から31の範囲を超えた量によるシフト (I
CAST_BAD_SHIFT_AMOUNT)</a></h3> |
| 1534 |
| 1535 |
| 1536 <p> |
| 1537 このコードは、32ビット int の-31から31の範囲を超えた量でシフトを実行しています。 |
| 1538 これの効果は、どのくらいシフトするのかを決めるために整数値の下位5ビット (32で割った余り) を使うことです (たとえば、40ビットでシフトすることは8ビット
でシフトすることと同じで、32ビットでシフトすることは0ビットでシフトすることと同じです)。 |
| 1539 これは、おそらく期待されたことではなく、少なくとも紛らわしいです。 |
| 1540 </p> |
| 1541 |
| 1542 |
| 1543 <h3><a name="BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR">Bx: プリミティブ値が3項演算子のためにア
ンボクシングされて、型変換される (BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR)</a></h3> |
| 1544 |
| 1545 |
| 1546 <p> |
| 1547 ラップされたプリミティブ値は、3項演算子 (<code> b ? e1 : e2</code>) の評価の一部として、別のプリミティブ型にアンボクシングされて変
換されます。 |
| 1548 Java 言語仕様では、<code>e1</code> と <code>e2</code> がラップされた数値なら値はアンボクシングされ、共通の型へと変換/型変
換されます |
| 1549 (たとえば、<code>e1</code> が <code>Integer</code> で、<code>e2</code> が <code>Float</co
de> なら <code>e1</code> はアンボクシング (<code>int</code> に変換) され、<code>float</code> に変換
され、ボクシング (<code>Float</code> に変換) されます)。 |
| 1550 JLS セクション15.25を参照してください。 |
| 1551 </p> |
| 1552 |
| 1553 |
| 1554 <h3><a name="CO_COMPARETO_RESULTS_MIN_VALUE">Co: compareTo()/compare() は Integer
.MIN_VALUE を返す (CO_COMPARETO_RESULTS_MIN_VALUE)</a></h3> |
| 1555 |
| 1556 |
| 1557 <p> |
| 1558 いくつかの状況下では、この <code>compareTo</code> または <code>compare</code> メソッドは Integer.MIN_
VALUE を返します。それは、非常に間違ったプラクティスです。 |
| 1559 <code>compareTo</code> メソッドの戻り値で重要なことは結果の符号だけです。 |
| 1560 しかし、結果の符号を無効にすることを期待して、<code>compareTo</code> メソッドの戻り値を無効にすることがあります。 |
| 1561 戻り値が Integer.MIN_VALUE である場合を除き、Integer.MIN_VALUE よりも-1を返します。 |
| 1562 </p> |
| 1563 |
| 1564 |
| 1565 <h3><a name="DLS_DEAD_LOCAL_INCREMENT_IN_RETURN">DLS: return 文に役に立たないインクリメントがある
(DLS_DEAD_LOCAL_INCREMENT_IN_RETURN)</a></h3> |
| 1566 |
| 1567 |
| 1568 <p> |
| 1569 <code>return x++;</code> のような return 文があります。 |
| 1570 接頭辞インクリメント/デクリメントは 式の値に影響を与えないので、インクリメント/デクリメントは効果がありません。 |
| 1571 この文が正しいのか確かめてください。 |
| 1572 </p> |
| 1573 |
| 1574 |
| 1575 <h3><a name="DLS_DEAD_STORE_OF_CLASS_LITERAL">DLS: クラスリテラルの無効な代入 (DLS_DEAD_STORE
_OF_CLASS_LITERAL)</a></h3> |
| 1576 |
| 1577 |
| 1578 <p> |
| 1579 この命令は変数にクラスリテラルを代入していますが、決して使われません。<br> |
| 1580 <a href="//java.sun.com/j2se/1.5.0/compatibility.html#literal">The behavior of t
his differs in Java 1.4 and in Java 5</a><br> |
| 1581 J2SE 1.4 およびそれ以前のバージョンでは、<code>Foo.class</code> への参照は <code>Foo</code> のためのスタティッ
クイニシャライザがすでに実行されていないなら実行することを強制します。 |
| 1582 J2SE 5.0 ではそうしません。 |
| 1583 </p> |
| 1584 <p> |
| 1585 より多くの詳細と例と J2SE 5.0 のクラスの強制的な初期化の方法の提案は Sun の <a href="//java.sun.com/j2se/1.5.0
/compatibility.html#literal">article on Java SE compatibility</a> を参照してください。 |
| 1586 </p> |
| 1587 |
| 1588 |
| 1589 <h3><a name="DLS_OVERWRITTEN_INCREMENT">DLS: 上書きされたインクリメント (DLS_OVERWRITTEN_INCR
EMENT)</a></h3> |
| 1590 |
| 1591 |
| 1592 <p> |
| 1593 このコードは、インクリメント演算 (たとえば、<code>i++</code>) を実行してすぐに上書きしています。 |
| 1594 たとえば、<code>i = i++</code> は元の値をインクリメントした値で上書きします。 |
| 1595 </p> |
| 1596 |
| 1597 |
| 1598 <h3><a name="DMI_ARGUMENTS_WRONG_ORDER">DMI: 逆にされた引数 (DMI_ARGUMENTS_WRONG_ORDER)
</a></h3> |
| 1599 |
| 1600 |
| 1601 <p> |
| 1602 このメソッド呼び出しへの引数は、順序が間違っているように見えます。 |
| 1603 たとえば、呼び出し <code>Preconditions.checkNotNull("message", message)</code> は、引数を予約しまし
た。チェックされる値は第一引数です。 |
| 1604 </p> |
| 1605 |
| 1606 |
| 1607 <h3><a name="DMI_BAD_MONTH">DMI: 月のための間違った定数値 (DMI_BAD_MONTH)</a></h3> |
| 1608 |
| 1609 |
| 1610 <p> |
| 1611 このコードは、メソッドに0から11の範囲外の月定数値を渡しています。 |
| 1612 </p> |
| 1613 |
| 1614 |
| 1615 <h3><a name="DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE">DMI: 正確に表されない double から構築され
た BigDecimal (DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE)</a></h3> |
| 1616 |
| 1617 |
| 1618 <p> |
| 1619 このコードは、10進数の数にうまく変換されない double 値から BigDecimal を作成しています。 |
| 1620 たとえば、Java で <code>new BigDecimal(0.1)</code> と書くと、0.1と正確に等しい BigDecimal (スケールが1で
スケールなしの値が1) が作成されると思うかもしれませんが |
| 1621 実際には0.1000000000000000055511151231257827021181583404541015625と等しくなります。 |
| 1622 </p> |
| 1623 <p> |
| 1624 おそらく <code>BigDecimal.valueOf(double d)</code> メソッドの使用が望ましいです。BigDecimal(たとえば、<c
ode>BigDecimal.valueOf(0.1)</code> は0.1を与えます) を作成するためには double の文字列表現を使用します。 |
| 1625 </p> |
| 1626 |
| 1627 |
| 1628 <h3><a name="DMI_CALLING_NEXT_FROM_HASNEXT">DMI: hasNext メソッドで next メソッドを呼び出している
(DMI_CALLING_NEXT_FROM_HASNEXT)</a></h3> |
| 1629 |
| 1630 |
| 1631 <p> |
| 1632 <code>hasNext</code> メソッドは、<code>next</code> メソッドを呼び出しています。 |
| 1633 <code>hasNext</code> メソッドは、イテレータの状態を変更することになっていないので、ほぼ確実に間違っています。 |
| 1634 <code>next</code> メソッドがイテレータの状態を変更することになっています。 |
| 1635 </p> |
| 1636 |
| 1637 |
| 1638 <h3><a name="DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES">DMI: コレクションは自分自身を含める
べきではない (DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES)</a></h3> |
| 1639 |
| 1640 |
| 1641 <p> |
| 1642 この総称型コレクションメソッドへの呼び出しはコレクションに自分自身が含まれている (たとえば、<code>s.contains(s)</code> が true
だとして) 場合にだけ意味があります。 |
| 1643 これは true である可能性が低くて、もし true なら問題の原因になります (たとえば、無限再帰になっているハッシュコードの計算)。 |
| 1644 間違ったパラメータが渡されている可能性が高いです。 |
| 1645 </p> |
| 1646 |
| 1647 |
| 1648 <h3><a name="DMI_DOH">DMI: D'oh! 無意味なメソッド呼び出し (DMI_DOH)</a></h3> |
| 1649 |
| 1650 |
| 1651 <p> |
| 1652 この部分的なメソッド呼び出しは、検査から明らかな理由で意味がありません。 |
| 1653 </p> |
| 1654 |
| 1655 |
| 1656 <h3><a name="DMI_INVOKING_HASHCODE_ON_ARRAY">DMI: 配列で hashCode メソッドを呼び出している (DMI
_INVOKING_HASHCODE_ON_ARRAY)</a></h3> |
| 1657 |
| 1658 |
| 1659 <p> |
| 1660 このコードは、配列で <code>hashCode</code> メソッドを呼び出しています。 |
| 1661 配列で <code>hashCode</code> メソッドを呼び出すことは、System.identityHashCode と同じ値を返すので、コンテンツと配
列の長さを無視します。 |
| 1662 配列 <code>a</code> のコンテンツによるハッシュコードを必要とするなら、<code>java.util.Arrays.hashCode(a)</c
ode> を使用してください。 |
| 1663 </p> |
| 1664 |
| 1665 |
| 1666 <h3><a name="DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT">DMI: int に対して Double.longBi
tsToDouble() を呼び出している (DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT)</a></h3> |
| 1667 |
| 1668 |
| 1669 <p> |
| 1670 <code>Double.longBitsToDouble()</code> の呼び出しで、32ビット int 値が引数として渡されています。 |
| 1671 これはほぼ間違いなく意図したことではありませんし意図した結果を与えることはほとんどありません。 |
| 1672 </p> |
| 1673 |
| 1674 |
| 1675 <h3><a name="DMI_VACUOUS_SELF_COLLECTION_CALL">DMI: コレクションへの無意味な呼び出し (DMI_VACUOU
S_SELF_COLLECTION_CALL)</a></h3> |
| 1676 |
| 1677 |
| 1678 <p> |
| 1679 この呼び出しは意味がありません。 |
| 1680 どんなコレクション <code>c</code> も <code>c.containsAll(c)</code> を呼び出すことは常に true であるべきです
。 |
| 1681 そして、<code>c.retainAll(c)</code> は効果があるはずがありません。 |
| 1682 </p> |
| 1683 |
| 1684 |
| 1685 <h3><a name="DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION">Dm: ランタイムリテンションなしで、アノテ
ーションの存在を調べるためにリフレクションを使用することはできない (DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION)<
/a></h3> |
| 1686 |
| 1687 |
| 1688 <p> |
| 1689 アノテーションは、<code>@Retention(RetentionPolicy.RUNTIME)</code> でアノテートされなければ、リフレクション (
たとえば、<code>isAnnotationPresent(...)</code> メソッド) を使用して観測することができません。 |
| 1690 </p> |
| 1691 |
| 1692 |
| 1693 <h3><a name="DMI_FUTILE_ATTEMPT_TO_CHANGE_MAXPOOL_SIZE_OF_SCHEDULED_THREAD_POOL_
EXECUTOR">Dm: ScheduledThreadPoolExecutor の最大プールサイズを変えようとする無駄な試み (DMI_FUTILE_ATT
EMPT_TO_CHANGE_MAXPOOL_SIZE_OF_SCHEDULED_THREAD_POOL_EXECUTOR)</a></h3> |
| 1694 |
| 1695 |
| 1696 <p> |
| 1697 <code>ScheduledThreadPoolExecutor</code> は <code>ThreadPoolExecutor</code> から継承さ
れますが継承されたチューニングメソッドの一部は有効ではありません。 |
| 1698 特に、corePoolSize スレッドとアンバウンド形式のキューを使用する固定サイズプールとして動作するので、maximumPoolSize の調整は有効な効
果がありません。<br> |
| 1699 (<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/Sched
uledThreadPoolExecutor.html">Javadoc</a>) |
| 1700 </p> |
| 1701 |
| 1702 |
| 1703 <h3><a name="DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH_ZERO_CORE_THREADS">Dm: コアプー
ルサイズが0の ScheduledThreadPoolExecutor の作成 (DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH
_ZERO_CORE_THREADS)</a></h3> |
| 1704 |
| 1705 |
| 1706 <p> |
| 1707 コアプールサイズが0の <code>ScheduledThreadPoolExecutor</code> は決して何も実行しません。 |
| 1708 最大プールサイズへの変更は無視されます。<br> |
| 1709 (<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/Sched
uledThreadPoolExecutor.html#ScheduledThreadPoolExecutor(int)">Javadoc</a>) |
| 1710 </p> |
| 1711 |
| 1712 |
| 1713 <h3><a name="DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD">Dm: EasyMock メソッドへの役に立たない/無意味な
呼び出し (DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD)</a></h3> |
| 1714 |
| 1715 |
| 1716 <p> |
| 1717 この呼び出しは EasyMock メソッドにどんなオブジェクトも渡さないので何もしません。 |
| 1718 </p> |
| 1719 |
| 1720 |
| 1721 <h3><a name="EC_ARRAY_AND_NONARRAY">EC: equals メソッドを使用して配列と非配列を比較している (EC_ARRAY_
AND_NONARRAY)</a></h3> |
| 1722 |
| 1723 |
| 1724 <p> |
| 1725 このメソッドは、配列と配列であると思われない参照を比較するために <code>.equals(Object o)</code> を呼び出しています。 |
| 1726 比較されているものが違う型なら不等であることが保証されているので、比較はほぼ間違いなく誤りです。 |
| 1727 たとえそれらが両方とも配列であるとしても、配列の <code>equals</code> メソッドは2つの配列が同じオブジェクトであると決定するだけです。 |
| 1728 配列のコンテンツを比較するためには <code>java.util.Arrays.equals(Object[], Object[])</code> を使用して
ください。 |
| 1729 </p> |
| 1730 |
| 1731 |
| 1732 <h3><a name="EC_BAD_ARRAY_COMPARE">EC: 配列の equals メソッド呼び出しは == と等価である (EC_BAD_AR
RAY_COMPARE)</a></h3> |
| 1733 |
| 1734 |
| 1735 <p> |
| 1736 このメソッドは、配列で <code>.equals(Object o)</code> を呼び出しています。 |
| 1737 配列は、<code>Object</code> の <code>equals</code> メソッドをオーバーライドしないので、配列で <code>equals
</code> メソッドを呼び出すことはアドレスを比較することと同じです。 |
| 1738 配列のコンテンツを比較するためには <code>java.util.Arrays.equals(Object[], Object[])</code> を使用して
ください。 |
| 1739 配列のアドレスを比較するために、明示的に、<code>==</code> を使用して参照等価性をチェックすることは、それほど紛らわしくないでしょう。 |
| 1740 </p> |
| 1741 |
| 1742 |
| 1743 <h3><a name="EC_INCOMPATIBLE_ARRAY_COMPARE">EC: equals(...) メソッドを使用して互換性のない配列を比較
している (EC_INCOMPATIBLE_ARRAY_COMPARE)</a></h3> |
| 1744 |
| 1745 |
| 1746 <p> |
| 1747 このメソッドは、互換性のない型の配列を比較するために <code>.equals(Object o)</code> を呼び出しています (たとえば、<code>
String[]</code> と <code>StringBuffer[]</code>、<code>String[]</code> と <code>int[
]</code>) 。 |
| 1748 それらは、決して等価ではありません。 |
| 1749 さらに、<code>equals(...)</code> が配列を比較するのに使用されるとき、それらが同じ配列であるかどうか確かめるだけで、配列のコンテンツは無
視します。 |
| 1750 </p> |
| 1751 |
| 1752 |
| 1753 <h3><a name="EC_NULL_ARG">EC: equals(null) の呼び出し (EC_NULL_ARG)</a></h3> |
| 1754 |
| 1755 |
| 1756 <p> |
| 1757 このメソッドは、 null 値の引数を渡して <code>equals(Object)</code> を呼び出しています。 |
| 1758 <code>equals</code> メソッドの規約によると、この呼び出しは常に false を返すはずです。 |
| 1759 </p> |
| 1760 |
| 1761 |
| 1762 <h3><a name="EC_UNRELATED_CLASS_AND_INTERFACE">EC: equals メソッドを呼び出して無関係のクラスとインタフ
ェースを比較している (EC_UNRELATED_CLASS_AND_INTERFACE)</a></h3> |
| 1763 |
| 1764 |
| 1765 <p> |
| 1766 このメソッドは、一方がクラスで他方がインタフェースである2つの参照で <code>equals(Object)</code> メソッドを呼び出しています。 |
| 1767 クラスは、そのクラスの非抽象サブクラスも含めてインタフェースを実装していません。 |
| 1768 したがって比較されている2つのオブジェクトは実行時に同じクラスのメンバである可能性が低いです (いくつかのアプリケーションクラスが解析できなかったか、動的クラス
ローディングが実行時に起こることができた場合を除く)。 |
| 1769 <code>equals</code> メソッドの規約によると、異なるクラスのオブジェクトは常に不等として比較するべきです。 |
| 1770 したがって、<code>java.lang.Object.equals(Object)</code> によって定義される規約によれば、この比較の結果は実行時に常
に false になります。 |
| 1771 </p> |
| 1772 |
| 1773 |
| 1774 <h3><a name="EC_UNRELATED_INTERFACES">EC: equals メソッドを呼び出して異なる型のインタフェースを比較している (
EC_UNRELATED_INTERFACES)</a></h3> |
| 1775 |
| 1776 |
| 1777 <p> |
| 1778 このメソッドは、どちらも他方のサブタイプでない無関係なインタフェース型の2つの参照で <code>equals(Object)</code> メソッドを呼び出し
ています。 |
| 1779 そして、両方のインタフェースを実装する既知の非抽象クラスがありません。 |
| 1780 したがって比較されている2つのオブジェクトは実行時に同じクラスのメンバである可能性が低いです (いくつかのアプリケーションクラスが解析できなかったか、動的クラス
ローディングが実行時に起こることができた場合を除く)。 |
| 1781 <code>equals</code> メソッドの規約によると、異なるクラスのオブジェクトは常に不等として比較するべきです。 |
| 1782 したがって、<code>java.lang.Object.equals(Object)</code> によって定義される規約によれば、この比較の結果は実行時に常
に false になります。 |
| 1783 </p> |
| 1784 |
| 1785 |
| 1786 <h3><a name="EC_UNRELATED_TYPES">EC: equals メソッドを呼び出して異なる型を比較している (EC_UNRELATED_
TYPES)</a></h3> |
| 1787 |
| 1788 |
| 1789 <p> |
| 1790 このメソッドは、共通のサブクラスがない異なるクラス型の2つのオブジェクト参照で <code>equals(Object)</code> メソッドを呼び出していま
す。 |
| 1791 したがって比較されている2つのオブジェクトは実行時に同じクラスのメンバである可能性が低いです (いくつかのアプリケーションクラスが解析できなかったか、動的クラス
ローディングが実行時に起こることができた場合を除く)。 |
| 1792 <code>equals</code> メソッドの規約によると、異なるクラスのオブジェクトは常に不等として比較するべきです。 |
| 1793 したがって、<code>java.lang.Object.equals(Object)</code> によって定義される規約によれば、この比較の結果は実行時に常
に false になります。 |
| 1794 </p> |
| 1795 |
| 1796 |
| 1797 <h3><a name="EC_UNRELATED_TYPES_USING_POINTER_EQUALITY">EC: 参照等価性を使用して異なる型を比較してい
る (EC_UNRELATED_TYPES_USING_POINTER_EQUALITY)</a></h3> |
| 1798 |
| 1799 |
| 1800 <p> |
| 1801 このメソッドは異なる型と思われる2つの参照を比較するために参照等価性を使用しています。 |
| 1802 この比較の結果は、常に false です。 |
| 1803 </p> |
| 1804 |
| 1805 |
| 1806 <h3><a name="EQ_ALWAYS_FALSE">Eq: equals メソッドは常に false を戻す (EQ_ALWAYS_FALSE)</a>
</h3> |
| 1807 |
| 1808 |
| 1809 <p> |
| 1810 このクラスでは、常に false を返す <code>equlas</code> メソッドを定義しています。 |
| 1811 これは、オブジェクトがそれ自身と等価ではないことを意味していて、このクラスの有効な Map や Set を作成できません。 |
| 1812 より根本的に、<code>equals</code> メソッドの要件の一つである反射性を満たしていないことになります。 |
| 1813 </p> |
| 1814 <p> |
| 1815 おそらく意図されたことは、オブジェクトはそれ自身と等価であるというオブジェクト同一性です。 |
| 1816 これは <code>Object</code> クラスから継承される振る舞いです。 |
| 1817 異なるスーパークラスから継承される <code>equals</code> メソッドをオーバーライドする必要があるなら以下のようなコードが使えます。 |
| 1818 </p> |
| 1819 <blockquote><pre> |
| 1820 public boolean equals(Object o) { |
| 1821 return this == o; |
| 1822 } |
| 1823 </pre></blockquote> |
| 1824 |
| 1825 |
| 1826 <h3><a name="EQ_ALWAYS_TRUE">Eq: equals メソッドは常に true を返す (EQ_ALWAYS_TRUE)</a></h
3> |
| 1827 |
| 1828 |
| 1829 <p> |
| 1830 このクラスは、常に true を返す <code>equals</code> メソッドを定義しています。 |
| 1831 これは想像力に富むが、あまり良い方法とはいえません。さらに、<code>equals</code> メソッドが対称的ではないことを意味します。 |
| 1832 </p> |
| 1833 |
| 1834 |
| 1835 <h3><a name="EQ_COMPARING_CLASS_NAMES">Eq: equals メソッドはクラスオブジェクトではなくクラス名を比較している
(EQ_COMPARING_CLASS_NAMES)</a></h3> |
| 1836 |
| 1837 |
| 1838 <p> |
| 1839 このメソッドは、クラス名を比較することによって、2つのオブジェクトが同じクラスなのか確かめています。 |
| 1840 異なるクラスローダによってロードされたクラスなら、同じ名前で異なるクラスがある可能性があります。 |
| 1841 クラスオブジェクトが同じなのか確かめてください。 |
| 1842 </p> |
| 1843 |
| 1844 |
| 1845 <h3><a name="EQ_DONT_DEFINE_EQUALS_FOR_ENUM">Eq: 列挙型は共変な equals メソッドを定義している (EQ_
DONT_DEFINE_EQUALS_FOR_ENUM)</a></h3> |
| 1846 |
| 1847 |
| 1848 <p> |
| 1849 このクラスは列挙を定義していて、列挙の等価性はオブジェクト同一性を使用して定義されています。 |
| 1850 列挙値のために共変な <code>equals</code> メソッドを定義することは、非常に間違ったプラクティスです。 |
| 1851 2つの異なる列挙値が一般にの <code>equals</code> メソッドでは「等価ではない」と判定され、共変な <code>equals</code> メ
ソッドでは「等価」と判定されるからです。 |
| 1852 共変な <code>equals</code> メソッドを定義しないでください。 |
| 1853 </p> |
| 1854 |
| 1855 |
| 1856 <h3><a name="EQ_OTHER_NO_OBJECT">Eq: equals(Object) メソッドをオーバーライドしていない equals メソッ
ドの定義 (EQ_OTHER_NO_OBJECT)</a></h3> |
| 1857 |
| 1858 |
| 1859 <p> |
| 1860 このクラスは、<code>equals</code> メソッドを定義していますが、<code>java.lang.Object</code> クラスの <cod
e>equals(Object)</code> メソッドをオーバーライドしていません。 |
| 1861 その代わりに、スーパークラスから <code>equals(Object)</code> メソッドを継承して、<code>boolean equals(Obje
ct)</code> メソッドを定義するべきです。 |
| 1862 </p> |
| 1863 |
| 1864 |
| 1865 <h3><a name="EQ_OTHER_USE_OBJECT">Eq: Object.equals(Object) をオーバーライドしていない equals
メソッドの定義 (EQ_OTHER_USE_OBJECT)</a></h3> |
| 1866 |
| 1867 |
| 1868 <p> |
| 1869 このクラスは、<code>equals</code> メソッドを定義していますが、<code>java.lang.Object</code> クラスの <cod
e>equals(Object)</code> メソッドをオーバーライドしていません。 |
| 1870 クラスは、<code>boolean equals(Object)</code> メソッドを定義するべきです。 |
| 1871 </p> |
| 1872 |
| 1873 |
| 1874 <h3><a name="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC">Eq: equals メソッドはスーパークラスの equals
メソッドをオーバーライドしているが、対称的ではないかもしれない (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC)</a></h3> |
| 1875 |
| 1876 |
| 1877 <p> |
| 1878 このクラスはスーパークラスの <code>equals</code> メソッドをオーバーライドする <code>equals</code> メソッドを定義してい
ます。 |
| 1879 両方の <code>equals</code> メソッドは、2つのオブジェクトが等しいかどうかの判定で、<code>instanceof</code> を使用し
ています。 |
| 1880 <code>equals</code> メソッドは対称的 (<code>a.equals(b) == b.equals(a)</code>) であることが重要な
のでこれは危険を伴っています。 |
| 1881 <i>B</i> が <i>A</i> のサブタイプなら <i>A</i> の <code>equals</code> メソッドは引数が <code>insta
nceof A</code> なのかチェックします。 |
| 1882 そして、<i>B</i> の <code>equals</code> メソッドは引数が <code>instanceof B</code> なのかチェックします
。 |
| 1883 これらのメソッドによって定義された同値関係が対称的でないということです。 |
| 1884 </p> |
| 1885 |
| 1886 |
| 1887 <h3><a name="EQ_SELF_USE_OBJECT">Eq: 共変な equals メソッドを定義して、Object.equals(Object)
を継承している (EQ_SELF_USE_OBJECT)</a></h3> |
| 1888 |
| 1889 |
| 1890 <p> |
| 1891 このクラスは、共変な <code>equals</code> メソッドを定義していますが、 <code>equals(Object)</code> メソッドは
<code>java.lang.Object</code> クラスから継承しています。 |
| 1892 クラスは、<code>boolean equals(Object)</code> メソッドを定義するべきです。 |
| 1893 </p> |
| 1894 |
| 1895 |
| 1896 <h3><a name="FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER">FE: NaN への等価性のための絶望的なテスト (FE_TEST
_IF_EQUAL_TO_NOT_A_NUMBER)</a></h3> |
| 1897 |
| 1898 |
| 1899 <p> |
| 1900 このコードは、浮動小数点が特別な非数値と等価であるか確かめています (たとえば <code>if (x == Double.NaN)</code>)。 |
| 1901 しかしながら、<code>NaN</code> の特別な意味のため、値は <code>NaN</code> と等価ではありません。 |
| 1902 したがって、<code>x == Double.NaN</code> は常に false と評価します。 |
| 1903 <code>x</code> という値が特別な非数値であるかどうか確かめるためには <code>Double.isNaN(x)</code> を使用します (あ
るいは <code>x</code> が浮動小数点精度であるなら <code>Float.isNaN(x)</code>)。 |
| 1904 </p> |
| 1905 |
| 1906 |
| 1907 <h3><a name="VA_FORMAT_STRING_BAD_ARGUMENT">FS: 書式指示子へ渡している引数に互換性がない (VA_FORMAT_
STRING_BAD_ARGUMENT)</a></h3> |
| 1908 |
| 1909 |
| 1910 <p> |
| 1911 書式指示子は、対応する引数と互換性がありません。 |
| 1912 たとえば、<code>System.out.println("%d\n", "hello");</code> の %d 書式指示子は数値の引数を必要としますが数
値ではなく文字列が渡されています。 |
| 1913 この文が実行されると実行時例外が発生します。 |
| 1914 </p> |
| 1915 |
| 1916 |
| 1917 <h3><a name="VA_FORMAT_STRING_BAD_CONVERSION">FS: 与えられた引数の型は書式指示子に合致しません (VA_FOR
MAT_STRING_BAD_CONVERSION)</a></h3> |
| 1918 |
| 1919 |
| 1920 <p> |
| 1921 引数の1つは、対応する書式指示子と互換性がありません。その結果、実行されるときに実行時例外を生成します。 |
| 1922 たとえば、<code>String.format("%d", "1")</code> は、文字列 "1" が書式指示子 "%d" と互換性がないので例外を生成し
ます。 |
| 1923 </p> |
| 1924 |
| 1925 |
| 1926 <h3><a name="VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED">FS: printf スタイルの
書式が期待されているところで MessageFormat が与えられている (VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_
SUPPLIED)</a></h3> |
| 1927 |
| 1928 |
| 1929 <p> |
| 1930 Java の printf 書式文字列と引数のリストを期待するメソッドが呼び出されています。 |
| 1931 しかしながら、書式文字列にはどんな書式指示子 (たとえば、%s) も含まないで、メッセージフォーマットの要素 (たとえば、{0}) を含んでいます。 |
| 1932 printf スタイルの書式文字列が必要なときに、MessageFormat の文字列を与えている可能性が高いです。 |
| 1933 実行時に、すべての引数は無視され、書式文字列は正確にフォーマットされずに返されます。 |
| 1934 </p> |
| 1935 |
| 1936 |
| 1937 <h3><a name="VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED">FS: 書式文字列で実際に使われるより、多くの引数が
渡されている (VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED)</a></h3> |
| 1938 |
| 1939 |
| 1940 <p> |
| 1941 可変長引数による書式文字列メソッドが呼び出されていますが書式文字列で実際に使われるより多くの引数が渡されています。 |
| 1942 これは実行時例外の原因とはなりませんが、コードはフォーマットされた文字列に含まれることを意図した情報を黙って省略しているかもしれません。 |
| 1943 </p> |
| 1944 |
| 1945 |
| 1946 <h3><a name="VA_FORMAT_STRING_ILLEGAL">FS: 無効な書式文字列 (VA_FORMAT_STRING_ILLEGAL)</
a></h3> |
| 1947 |
| 1948 |
| 1949 <p> |
| 1950 書式文字列は構文的に無効です。この文が実行されると実行時例外が発生します。 |
| 1951 </p> |
| 1952 |
| 1953 |
| 1954 <h3><a name="VA_FORMAT_STRING_MISSING_ARGUMENT">FS: 書式文字列は足りない引数を参照している (VA_FORM
AT_STRING_MISSING_ARGUMENT)</a></h3> |
| 1955 |
| 1956 |
| 1957 <p> |
| 1958 書式文字列で書式指示子を満たすために十分な引数が渡されていません。この文が実行されると実行時例外が発生します。 |
| 1959 </p> |
| 1960 |
| 1961 |
| 1962 <h3><a name="VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT">FS: 書式文字列ための前の引数がない (VA_FORM
AT_STRING_NO_PREVIOUS_ARGUMENT)</a></h3> |
| 1963 |
| 1964 |
| 1965 <p> |
| 1966 この書式文字列は、前の書式指示子の引数が再利用されるようにするために「相対インデックス ("<")」を指定しています。 |
| 1967 しかしながら、前の引数がありません。 |
| 1968 たとえば、<code>formatter.format("%<s %s", "a", "b")</code> が実行されると MissingFormatA
rgumentException をスローします。 |
| 1969 </p> |
| 1970 |
| 1971 |
| 1972 <h3><a name="GC_UNRELATED_TYPES">GC: 型パラメータとメソッド引数に関係がない (GC_UNRELATED_TYPES)</a
></h3> |
| 1973 |
| 1974 |
| 1975 <p> |
| 1976 総称型コレクションメソッドへの呼び出しにコレクションのパラメータとは互換性のないクラスの引数があります (すなわち、引数の型は総称型引数に対応するスーパタイプで
もサブタイプでもありません)。 |
| 1977 したがって、コレクションにはここで使用されたメソッド引数と等価であるどんなオブジェクトも含まれていません。 |
| 1978 多分間違った値がメソッドに渡されています。 |
| 1979 一般に、2つの無関係なクラスのインスタンスは等価ではありません。 |
| 1980 たとえば、<code>Foo</code> と <code>Bar</code> クラスがサブタイプによって関係がないなら、<code>Foo</code> の
インスタンスは <code>Bar</code> のインスタンスと等価のはずがありません。 |
| 1981 その他の問題で対称的ではない <code>equals</code> メソッドになる可能性が高いです。 |
| 1982 たとえば、<code>Foo</code> が <code>String</code> と等価であるように <code>Foo</code> クラスを定義するな
ら、<code>String</code> は <code>String</code> だけと等価であるので、<code>equals</code> メソッドは
対称的ではありません。 |
| 1983 </p> |
| 1984 <p> |
| 1985 まれに、非対称 <code>equals</code> メソッドを定義して、まだ、何とかそれらのコードを機能させています。 |
| 1986 APIのどれも文書化していないか、保証もしていないが、<code>Collection<String></code> に <code>Foo</co
de> があるかどうか調べたいなら、 |
| 1987 引数の <code>equals</code> メソッド (たとえば、<code>Foo</code>クラスの <code>equals</code> メソッド
) を使用して等価性をチェックします。 |
| 1988 </p> |
| 1989 |
| 1990 |
| 1991 <h3><a name="HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS">HE: ハッシュ化された文脈でハ
ッシュ化できないクラスの使用がシグネチャで宣言されている (HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS)
</a></h3> |
| 1992 |
| 1993 |
| 1994 <p> |
| 1995 メソッド、フィールド、クラスは、ハッシュ可能なクラスが必要な文脈で、ハッシュ化できないクラスが使用される総称的なシグネチャを宣言しています。 |
| 1996 クラスは、<code>equals</code> メソッドを宣言していますが、<code>hashCode</code> メソッドは <code>java.la
ng.Object</code> から継承しています。 |
| 1997 これは「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に従っていないのでハ
ッシュ化できません。 |
| 1998 </p> |
| 1999 |
| 2000 |
| 2001 <h3><a name="HE_USE_OF_UNHASHABLE_CLASS">HE: ハッシュデータ構造で hashCode メソッドのないクラスを使用して
いる (HE_USE_OF_UNHASHABLE_CLASS)</a></h3> |
| 2002 |
| 2003 |
| 2004 <p> |
| 2005 このクラスは、<code>equals(Object)</code> メソッドを定義していますが、<code>hashCode</code> メソッドを定義して
いません。 |
| 2006 これは「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に従っていません。 |
| 2007 このクラスのインスタンスはハッシュデータ構造で使われています。最重要問題を修正する必要があります。 |
| 2008 </p> |
| 2009 |
| 2010 |
| 2011 <h3><a name="ICAST_INT_2_LONG_AS_INSTANT">ICAST: int 値を long に変換して絶対時間として使用している
(ICAST_INT_2_LONG_AS_INSTANT)</a></h3> |
| 2012 |
| 2013 |
| 2014 <p> |
| 2015 このコードは、32ビット int 値を64ビット long 値に変換して、絶対時間値を必要とするメソッドパラメータに渡しています。 |
| 2016 絶対時間値は、「エポック」(すなわち、1970年1月1日、00:00:00 GMT)としてわかっている標準的な基準時間からのミリ秒数です。<br> |
| 2017 たとえば、次のメソッド(Date にエポックから秒を変換することを意図した)は、ひどく壊れています。 |
| 2018 </p> |
| 2019 <blockquote><pre> |
| 2020 Date getDate(int seconds) { return new Date(seconds * 1000); } |
| 2021 </pre></blockquote> |
| 2022 <p> |
| 2023 乗算は32ビット演算を使用して、64ビット値に変換されます。 |
| 2024 32ビット値は、64ビットに変換されて、絶対時間値を表すために使用されるとき、1969年12月と1970年1月の日付しか表せません。 |
| 2025 </p> |
| 2026 <p> |
| 2027 上記のメソッドのための正しい実装は、以下のとおりです。 |
| 2028 </p> |
| 2029 <blockquote><pre> |
| 2030 // 失敗、2037年後の日付 |
| 2031 Date getDate(int seconds) { return new Date(seconds * 1000L); } |
| 2032 |
| 2033 // より良い、すべての日付で動作する |
| 2034 Date getDate(long seconds) { return new Date(seconds * 1000); } |
| 2035 </pre></blockquote> |
| 2036 |
| 2037 |
| 2038 <h3><a name="ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL">ICAST: 整数値を double にキャストして
Math.ceil() に渡している (ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL)</a></h3> |
| 2039 |
| 2040 |
| 2041 <p> |
| 2042 このコードは、整数値 (たとえば、int や long) を倍精度浮動小数点に変換してから、その結果を <code>Math.ceil()</code> に渡し
ています。 |
| 2043 整数を double に変換すると小数部がない数値が得られるので、この演算は常にノーオペレーションになります。 |
| 2044 <code>Math.ceil()</code>に渡される値を生成した演算が倍精度浮動小数点演算を使用して実行することを意図した可能性が高いです。 |
| 2045 </p> |
| 2046 |
| 2047 |
| 2048 <h3><a name="ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND">ICAST: 整数値を float にキャストして
Math.round() に渡している (ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND)</a></h3> |
| 2049 |
| 2050 |
| 2051 <p> |
| 2052 このコードは、整数値を float 精度浮動小数点に変換してから、その結果を <code>Math.round()</code> に渡して引数に最も近い int
/long を返します。 |
| 2053 整数を float に変換すると小数部がない数値が得られるので、この演算は常にノーオペレーションになります。 |
| 2054 <code>Math.round()</code>に渡される値を生成した演算が浮動小数点演算を使用して実行することを意図した可能性が高いです。 |
| 2055 </p> |
| 2056 |
| 2057 |
| 2058 <h3><a name="IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD">IJU: run メソッドでの JUnit アサ
ーションは JUnit によって通知されない (IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD)</a></h3> |
| 2059 |
| 2060 |
| 2061 <p> |
| 2062 <code>run</code> メソッドで JUnit アサーションが実行されています。失敗した JUnit アサーションは例外をスローします。 |
| 2063 したがって、この例外がテストメソッドを実行したスレッド以外のスレッドで発生するなら、例外はスレッドを終了させますが、テストの失敗になりません。 |
| 2064 </p> |
| 2065 |
| 2066 |
| 2067 <h3><a name="IJU_BAD_SUITE_METHOD">IJU: TestCase は suite メソッドの間違った宣言をしている (IJU_B
AD_SUITE_METHOD)</a></h3> |
| 2068 |
| 2069 |
| 2070 <p> |
| 2071 JUnit の TestCase クラスで、<code>suite</code> メソッドを実装しています。 |
| 2072 しかしながら、<code>suite</code> メソッドは、 |
| 2073 </p> |
| 2074 <blockquote><pre> |
| 2075 public static junit.framework.Test suite() |
| 2076 </pre></blockquote> |
| 2077 <p>か</p> |
| 2078 <blockquote><pre> |
| 2079 public static junit.framework.TestSuite suite() |
| 2080 </pre></blockquote> |
| 2081 <p> |
| 2082 のどちらかを宣言する必要があります。 |
| 2083 </p> |
| 2084 |
| 2085 |
| 2086 <h3><a name="IJU_NO_TESTS">IJU: TestCase はテストがない (IJU_NO_TESTS)</a></h3> |
| 2087 |
| 2088 |
| 2089 <p> |
| 2090 JUnit の TestCase クラスで、どんなテストメソッドも実装していません。 |
| 2091 </p> |
| 2092 |
| 2093 |
| 2094 <h3><a name="IJU_SETUP_NO_SUPER">IJU: TestCase は super.setup() を呼び出さない setUp メソッ
ドを実装している (IJU_SETUP_NO_SUPER)</a></h3> |
| 2095 |
| 2096 |
| 2097 <p> |
| 2098 JUnit の TestCase クラスで、<code>setUp</code> メソッドを実装しています。 |
| 2099 <code>setUp</code> メソッドは、<code>super.setUp()</code> を呼び出すべきなのにそうしていません。 |
| 2100 </p> |
| 2101 |
| 2102 |
| 2103 <h3><a name="IJU_SUITE_NOT_STATIC">IJU: TestCase は 非 static な suite メソッドを実装している
(IJU_SUITE_NOT_STATIC)</a></h3> |
| 2104 |
| 2105 |
| 2106 <p> |
| 2107 JUnit の TestCase クラスで、<code>suite</code> メソッドを実装しています。 |
| 2108 <code>suite</code> メソッドは static として宣言するべきなのにそうしていません。 |
| 2109 </p> |
| 2110 |
| 2111 |
| 2112 <h3><a name="IJU_TEARDOWN_NO_SUPER">IJU: TestCase は super.tearDown() を呼び出さない tea
rDown メソッドを実装している (IJU_TEARDOWN_NO_SUPER)</a></h3> |
| 2113 |
| 2114 |
| 2115 <p> |
| 2116 JUnit の TestCase クラスで、<code>tearDown</code> メソッドを実装しています。 |
| 2117 <code>tearDown</code> メソッドは、<code>super.tearDown()</code> を呼び出すべきなのにそうしていません。 |
| 2118 </p> |
| 2119 |
| 2120 |
| 2121 <h3><a name="IL_CONTAINER_ADDED_TO_ITSELF">IL: コレクションは自分自身を追加している (IL_CONTAINER_
ADDED_TO_ITSELF)</a></h3> |
| 2122 |
| 2123 |
| 2124 <p> |
| 2125 コレクションは、自分自身を追加しています。その結果、hashCode を計算すると <code>StackOverflowException</code> をス
ローします。 |
| 2126 </p> |
| 2127 |
| 2128 |
| 2129 <h3><a name="IL_INFINITE_LOOP">IL: 明らかな無限ループ (IL_INFINITE_LOOP)</a></h3> |
| 2130 |
| 2131 |
| 2132 <p> |
| 2133 このループは、例外をスローする以外の方法で終了させることができないように思われます。 |
| 2134 </p> |
| 2135 |
| 2136 |
| 2137 <h3><a name="IL_INFINITE_RECURSIVE_LOOP">IL: 明らかな無限再帰ループ (IL_INFINITE_RECURSIVE_
LOOP)</a></h3> |
| 2138 |
| 2139 |
| 2140 <p> |
| 2141 このメソッドは、無条件で自分自身を呼び出します。これは、スタックオーバーフローになる無限再帰ループを示しています。 |
| 2142 </p> |
| 2143 |
| 2144 |
| 2145 <h3><a name="IM_MULTIPLYING_RESULT_OF_IREM">IM: 整数剰余の結果の整数乗算 (IM_MULTIPLYING_RES
ULT_OF_IREM)</a></h3> |
| 2146 |
| 2147 |
| 2148 <p> |
| 2149 このコードは、整数剰余の結果に整数定数を乗算しています。 |
| 2150 紛らわしい演算子の優先順位がないことを確実にしてください。 |
| 2151 たとえば、i % 60 * 1000 は、i % (60 * 1000) ではなく (i % 60) * 1000 となります。 |
| 2152 </p> |
| 2153 |
| 2154 |
| 2155 <h3><a name="INT_BAD_COMPARISON_WITH_INT_VALUE">INT: int 値と long 定数との間違った比較 (INT
_BAD_COMPARISON_WITH_INT_VALUE)</a></h3> |
| 2156 |
| 2157 |
| 2158 <p> |
| 2159 このコードは、int 値と int 値として表現できる値の範囲外にある long 定数を比較しています。 |
| 2160 この比較は無意味で、おそらく間違っています。 |
| 2161 </p> |
| 2162 |
| 2163 |
| 2164 <h3><a name="INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE">INT: 負でない値と負の定数との間違った比較
(INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE)</a></h3> |
| 2165 |
| 2166 |
| 2167 <p> |
| 2168 このコードは、負でないことが保証されている値と負の定数とを比較しています。 |
| 2169 </p> |
| 2170 |
| 2171 |
| 2172 <h3><a name="INT_BAD_COMPARISON_WITH_SIGNED_BYTE">INT: 符号付きバイトの間違った比較 (INT_BAD_C
OMPARISON_WITH_SIGNED_BYTE)</a></h3> |
| 2173 |
| 2174 |
| 2175 <p> |
| 2176 符号付バイトのとりうる値の範囲は-128~127です。その範囲外で符号付バイトを値と比較することは無意味で間違っていそうです。 |
| 2177 符号付きバイト <code>b</code> を範囲が0~255の符号なしバイトに変換するには <code>0xff & b</code> を使用してく
ださい。 |
| 2178 </p> |
| 2179 |
| 2180 |
| 2181 <h3><a name="IO_APPENDING_TO_OBJECT_OUTPUT_STREAM">IO: オブジェクト出力ストリームへの追加は失敗に終わる
(IO_APPENDING_TO_OBJECT_OUTPUT_STREAM)</a></h3> |
| 2182 |
| 2183 |
| 2184 <p> |
| 2185 このコードは、ファイルを追加モードで開いて、オブジェクト出力ストリームの中で結果をラップしています。 |
| 2186 これは、ファイルに格納された既存のオブジェクト出力ストリームに追加できないでしょう。 |
| 2187 オブジェクト出力ストリームに追加したいなら、オブジェクト出力ストリームを開いておく必要があります。 |
| 2188 </p> |
| 2189 <p> |
| 2190 追加モードでファイルを開き、オブジェクト出力ストリームで書き込むことができる唯一の状況は、 |
| 2191 ファイルを読み出すときにランダムアクセスモードで開き、追加を開始するところまでバイトオフセットをシークすると計画した場合です。 |
| 2192 </p> |
| 2193 |
| 2194 |
| 2195 <h3><a name="IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN">IP: メソッドで読み取られずに上書きされているパラメータ
(IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN)</a></h3> |
| 2196 |
| 2197 |
| 2198 <p> |
| 2199 このパラメータの初期値は無視され、ここで上書きされています。 |
| 2200 これは多くの場合、パラメータへの書き込みが呼び出し元に戻されるという誤った考えを示しています。 |
| 2201 </p> |
| 2202 |
| 2203 |
| 2204 <h3><a name="MF_CLASS_MASKS_FIELD">MF: スーパークラスのフィールドを隠すフィールドを定義しているクラス (MF_CLASS
_MASKS_FIELD)</a></h3> |
| 2205 |
| 2206 |
| 2207 <p> |
| 2208 このクラスは、スーパークラスの可視インスタンスフィールドと同じ名前でフィールドを定義しています。 |
| 2209 これは紛らわしくて、メソッドがフィールドを更新するかアクセスするなら、間違いを指摘するかもしれません。 |
| 2210 </p> |
| 2211 |
| 2212 |
| 2213 <h3><a name="MF_METHOD_MASKS_FIELD">MF: フィールドを隠す変数を定義しているメソッド (MF_METHOD_MASKS_F
IELD)</a></h3> |
| 2214 |
| 2215 |
| 2216 <p> |
| 2217 このメソッドは、このクラスまたはスーパークラスのフィールドと同じ名前でローカル変数を定義しています。 |
| 2218 これはフィールドから初期化されていない値を読み出したり初期化されていないフィールドをそのままにしておくメソッドの原因になるかもしれません。 |
| 2219 </p> |
| 2220 |
| 2221 |
| 2222 <h3><a name="NP_ALWAYS_NULL">NP: null 値を利用している (NP_ALWAYS_NULL)</a></h3> |
| 2223 |
| 2224 |
| 2225 <p> |
| 2226 ここで null 値を利用しようとしています。 |
| 2227 コードが実行されると NullPointerException が発生します。 |
| 2228 </p> |
| 2229 |
| 2230 |
| 2231 <h3><a name="NP_ALWAYS_NULL_EXCEPTION">NP: null 値を例外経路で利用している (NP_ALWAYS_NULL_EX
CEPTION)</a></h3> |
| 2232 |
| 2233 |
| 2234 <p> |
| 2235 例外経路上のここで null 値を利用しています。コードが実行されると NullPointerException が発生します。 |
| 2236 現在の FindBugs は実行不可能な例外経路を取り除いていないので、誤検出かもしれないことに注意してください。 |
| 2237 </p> |
| 2238 <p> |
| 2239 switch 文の default が多くの場合実行不可能なので FindBugs が例外経路である default を検討することに注意して下さい。 |
| 2240 </p> |
| 2241 |
| 2242 |
| 2243 <h3><a name="NP_ARGUMENT_MIGHT_BE_NULL">NP: null の引数をチェックしていないメソッド (NP_ARGUMENT_
MIGHT_BE_NULL)</a></h3> |
| 2244 |
| 2245 |
| 2246 <p> |
| 2247 このメソッドへのパラメータが null かどうか確かめるために常にチェックされるべき値として特定されました。 |
| 2248 しかし、null チェックをしないで、null 値が利用されています。 |
| 2249 </p> |
| 2250 |
| 2251 |
| 2252 <h3><a name="NP_CLOSING_NULL">NP: 常に null 値のオブジェクトで close メソッドを呼び出している (NP_CLOSI
NG_NULL)</a></h3> |
| 2253 |
| 2254 |
| 2255 <p> |
| 2256 <code>close</code> メソッドは、常に null 値のオブジェクトで呼び出されています。 |
| 2257 この文が実行されるなら NullPointerException が発生します。 |
| 2258 ここでクローズするべき何かを決してクローズしないという大きな危険性があります。 |
| 2259 </p> |
| 2260 |
| 2261 |
| 2262 <h3><a name="NP_GUARANTEED_DEREF">NP: null 値を利用することが保証されている (NP_GUARANTEED_DEREF
)</a></h3> |
| 2263 |
| 2264 |
| 2265 <p> |
| 2266 文または分岐が実行されるなら、この時点で値は null であり、null 値を利用する (フォワードパスで実行時例外を伴うこと以外は) ことが保証されています。 |
| 2267 </p> |
| 2268 <p> |
| 2269 なお、<code>if (x == null) throw new NullPointerException();</code> は <code>x</code
> の参照解除として扱われることに注意して下さい。 |
| 2270 </p> |
| 2271 |
| 2272 |
| 2273 <h3><a name="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH">NP: null 値を例外経路で利用することが保証されて
いる (NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH)</a></h3> |
| 2274 |
| 2275 |
| 2276 <p> |
| 2277 例外経路上の文または分岐が実行されるなら、この時点で値は null であり、null 値を利用する (フォワードパスで実行時例外を伴うこと以外は) ことが保証さ
れています。 |
| 2278 </p> |
| 2279 |
| 2280 |
| 2281 <h3><a name="NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR">NP: 非 null フィールドは初
期化されていない (NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR)</a></h3> |
| 2282 |
| 2283 |
| 2284 <p> |
| 2285 フィールドは、非 null としてマークされていますが、コンストラクタで書き込まれていません。 |
| 2286 フィールドは、コンストラクタの間、ほかの場所で初期化されるか、または使用する前に常に初期化されるかもしれません。 |
| 2287 </p> |
| 2288 |
| 2289 |
| 2290 <h3><a name="NP_NONNULL_PARAM_VIOLATION">NP: メソッド呼び出しは非 null パラメータに対して null を渡して
いる (NP_NONNULL_PARAM_VIOLATION)</a></h3> |
| 2291 |
| 2292 |
| 2293 <p> |
| 2294 このメソッドは、非 null でなければならないメソッドのパラメータとして、null 値を渡しています。 |
| 2295 このパラメータは、@Nonnull として明示的にアノテートされていたか、または解析が常に null 値を利用すると示していました。 |
| 2296 </p> |
| 2297 |
| 2298 |
| 2299 <h3><a name="NP_NONNULL_RETURN_VIOLATION">NP: null を返すかもしれないメソッドが @NonNull 宣言されて
いる (NP_NONNULL_RETURN_VIOLATION)</a></h3> |
| 2300 |
| 2301 |
| 2302 <p> |
| 2303 このメソッドは、null 値を返すかもしれないのにメソッド (またはスーパークラスのメソッド) の戻り値に @NonNull が宣言されています。 |
| 2304 </p> |
| 2305 |
| 2306 |
| 2307 <h3><a name="NP_NULL_INSTANCEOF">NP: null とわかっている値をその型のインスタンスなのか確かめている (NP_NULL_
INSTANCEOF)</a></h3> |
| 2308 |
| 2309 |
| 2310 <p> |
| 2311 チェックされている値が null であることが保証されているので、instanceof は常に faluse を返します。 |
| 2312 これは安全で、誤解や論理エラーを指摘していないことを確認してください。 |
| 2313 </p> |
| 2314 |
| 2315 |
| 2316 <h3><a name="NP_NULL_ON_SOME_PATH">NP: null 値を利用している可能性がある (NP_NULL_ON_SOME_PATH
)</a></h3> |
| 2317 |
| 2318 |
| 2319 <p> |
| 2320 そこで分岐または文が実行されるなら null 値が利用されて NullPointerException が発生します。 |
| 2321 もちろん、問題は分岐または文が実行不可能で、NullPointerException が決して発生する可能性がないということかもしれません。 |
| 2322 それを決めるのは FindBugs の能力を超えています。 |
| 2323 </p> |
| 2324 |
| 2325 |
| 2326 <h3><a name="NP_NULL_ON_SOME_PATH_EXCEPTION">NP: null 値を例外経路で利用している可能性がある (NP_NU
LL_ON_SOME_PATH_EXCEPTION)</a></h3> |
| 2327 |
| 2328 |
| 2329 <p> |
| 2330 例外経路上のここで null 値が利用されています。コードが実行されると NullPointerException が発生するかもしれません。 |
| 2331 現在の FindBugs は実行不可能な例外経路を取り除かないので、誤検出かもしれないことに注意してください。 |
| 2332 </p> |
| 2333 <p> |
| 2334 switch 文の default が多くの場合実行不可能なので FindBugs が例外経路である default を検討することに注意して下さい。 |
| 2335 </p> |
| 2336 |
| 2337 |
| 2338 <h3><a name="NP_NULL_PARAM_DEREF">NP: メソッド呼び出しは非 null パラメータに対して null を渡している (NP_
NULL_PARAM_DEREF)</a></h3> |
| 2339 |
| 2340 |
| 2341 <p> |
| 2342 このメソッド呼び出しは非 null メソッドパラメータに対して null 値を渡しています。 |
| 2343 パラメータは、常に非 null とすべきパラメータとしてアノテートされていたか、または解析が常に null 値を利用すると示していました。 |
| 2344 </p> |
| 2345 |
| 2346 |
| 2347 <h3><a name="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS">NP: メソッド呼び出しは非 null パラメー
タに対して null を渡している (NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS)</a></h3> |
| 2348 |
| 2349 |
| 2350 <p> |
| 2351 すべての既知のターゲットメソッドが非 null であることをパラメータに要求する呼び出し場所で、おそらく null 値を渡しています。 |
| 2352 パラメータは、常に非 null とすべきパラメータとしてアノテートされていたか、または解析が常に null 値を利用すると示していました。 |
| 2353 </p> |
| 2354 |
| 2355 |
| 2356 <h3><a name="NP_NULL_PARAM_DEREF_NONVIRTUAL">NP: 非 null パラメータに null を渡している非仮想メソッ
ドの呼び出し (NP_NULL_PARAM_DEREF_NONVIRTUAL)</a></h3> |
| 2357 |
| 2358 |
| 2359 <p> |
| 2360 null の可能性がある値が、非 null メソッドパラメータに渡されています。 |
| 2361 パラメータは、常に非 null とすべきパラメータとしてアノテートされていたか、または解析が常に null 値を利用すると示していました。 |
| 2362 </p> |
| 2363 |
| 2364 |
| 2365 <h3><a name="NP_OPTIONAL_RETURN_NULL">NP: Optional の戻り型を持つメソッドが明示的に null を返す (NP
_OPTIONAL_RETURN_NULL)</a></h3> |
| 2366 |
| 2367 |
| 2368 <p> |
| 2369 Optional の戻り型の使い方は、常に明示的に null を返すのは設計が望ましくないことを意味します。 |
| 2370 null 値をこのようなケースで返すことは契約違反で、多分クライアントコードを破壊するでしょう。 |
| 2371 </p> |
| 2372 |
| 2373 |
| 2374 <h3><a name="NP_STORE_INTO_NONNULL_FIELD">NP: @NonNull でアノテートされたフィールドに null を格納し
ている (NP_STORE_INTO_NONNULL_FIELD)</a></h3> |
| 2375 |
| 2376 |
| 2377 <p> |
| 2378 @NonNull でアノテートされたフィールドに null かもしれない値を格納しています。 |
| 2379 </p> |
| 2380 |
| 2381 |
| 2382 <h3><a name="NP_UNWRITTEN_FIELD">NP: 書き込まれていないフィールドの読み出し (NP_UNWRITTEN_FIELD)</a
></h3> |
| 2383 |
| 2384 |
| 2385 <p> |
| 2386 プログラムは、決して null でない値を書き込むとは思われないフィールドの値を利用しています。 |
| 2387 この値を利用すると NullPointerException が発生します。 |
| 2388 </p> |
| 2389 |
| 2390 |
| 2391 <h3><a name="NM_BAD_EQUAL">Nm: クラスは equal(Object) を定義しています。equals(Object) にすべきです
か? (NM_BAD_EQUAL)</a></h3> |
| 2392 |
| 2393 |
| 2394 <p> |
| 2395 このクラスは、<code>equal(Object)</code> という名前のメソッドを定義しています。 |
| 2396 このメソッドは、<code>java.lang.Object</code> の <code>equals(Object)</code> を (おそらく意図的に)
オーバーライドしていません。 |
| 2397 </p> |
| 2398 |
| 2399 |
| 2400 <h3><a name="NM_LCASE_HASHCODE">Nm: クラスは hashcode() を定義しています。hashCode() にすべきですか?
(NM_LCASE_HASHCODE)</a></h3> |
| 2401 |
| 2402 |
| 2403 <p> |
| 2404 このクラスは、<code>hashcode()</code> という名前のメソッドを定義しています。 |
| 2405 このメソッドは、<code>java.lang.Object</code> の <code>hashCode</code> メソッドを (おそらく意図的に) オ
ーバーライドしていません。 |
| 2406 </p> |
| 2407 |
| 2408 |
| 2409 <h3><a name="NM_LCASE_TOSTRING">Nm: クラスは tostring() を定義しています。toString() にすべきですか?
(NM_LCASE_TOSTRING)</a></h3> |
| 2410 |
| 2411 |
| 2412 <p> |
| 2413 このクラスは、<code>tostring()</code> という名前のメソッドを定義しています。 |
| 2414 このメソッドは、<code>java.lang.Object</code> の <code>toString</code> メソッドを (おそらく意図的に) オ
ーバーライドしていません。 |
| 2415 </p> |
| 2416 |
| 2417 |
| 2418 <h3><a name="NM_METHOD_CONSTRUCTOR_CONFUSION">Nm: 明らかなメソッドとコンストラクタの混乱 (NM_METHOD
_CONSTRUCTOR_CONFUSION)</a></h3> |
| 2419 |
| 2420 |
| 2421 <p> |
| 2422 この正規のメソッドは定義しているクラスと同じ名前です。 |
| 2423 これはコンストラクタを意図していた可能性が高いです。もしそうなら void 戻り値の宣言を除去してください。 |
| 2424 このメソッドを定義したことが偶然間違っているとわかり、正しいコンストラクタを定義したが、下位互換性のためにこのメソッドを取り除くことができないなら、メソッドを非
推奨にしてください。 |
| 2425 </p> |
| 2426 |
| 2427 |
| 2428 <h3><a name="NM_VERY_CONFUSING">Nm: 非常に紛らわしい名前のメソッド (NM_VERY_CONFUSING)</a></h3> |
| 2429 |
| 2430 |
| 2431 <p> |
| 2432 参照されたメソッドは、大文字の使い方だけによって異なる名前があります。 |
| 2433 大文字の使い方が同一ならメソッドの1つが他のメソッドをオーバーライドするので、非常に紛らわしいです。 |
| 2434 </p> |
| 2435 |
| 2436 |
| 2437 <h3><a name="NM_WRONG_PACKAGE">Nm: パラメータの間違ったパッケージのために、スーパークラスのメソッドをオーバーライドしていない
メソッド (NM_WRONG_PACKAGE)</a></h3> |
| 2438 |
| 2439 |
| 2440 <p> |
| 2441 パラメータの型がスーパークラスで対応するパラメータの型と正確に合致していないので、サブクラスのメソッドはスーパークラスの類似したメソッドをオーバーライドしていま
せん。<br> |
| 2442 たとえば以下のようなコードです。 |
| 2443 </p> |
| 2444 <blockquote><pre> |
| 2445 import alpha.Foo; |
| 2446 |
| 2447 public class A { |
| 2448 public int f(Foo x) { return 17; } |
| 2449 } |
| 2450 ---- |
| 2451 import beta.Foo; |
| 2452 |
| 2453 public class B extends A { |
| 2454 public int f(Foo x) { return 42; } |
| 2455 } |
| 2456 </pre></blockquote> |
| 2457 <p> |
| 2458 クラス <code>B</code> で定義された <code>f(Foo)</code> メソッドは、クラス <code>A</code> の <code>f
(Foo)</code> メソッドをオーバーライドしていません。 |
| 2459 これは引数の型 <code>Foo</code> が違うパッケージだからです。 |
| 2460 </p> |
| 2461 |
| 2462 |
| 2463 <h3><a name="QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT">QBA: 論理式で boolean リテラル値を代入している
メソッド (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT)</a></h3> |
| 2464 |
| 2465 |
| 2466 <p> |
| 2467 このメソッドは、if または while の式の中の boolean 変数に boolean リテラル値 (true または false) を代入しています。 |
| 2468 おそらく、これは = による代入ではなく、== を使用して論理比較をすることになっていました。 |
| 2469 </p> |
| 2470 |
| 2471 |
| 2472 <h3><a name="RC_REF_COMPARISON">RC: 疑わしい参照比較 (RC_REF_COMPARISON)</a></h3> |
| 2473 |
| 2474 |
| 2475 <p> |
| 2476 このメソッドは、 == または != 演算子を使用して2つの参照値を比較しています。 |
| 2477 この型のインスタンスを比較する正しい方法は、一般に <code>equals</code> メソッドです。 |
| 2478 等価で識別可能なインスタンスを作成する可能性がありますが異なるオブジェクトなので == で比較しないでください。 |
| 2479 参照によって一般に比較されるべきでないクラスの例は、<code>java.lang.Integer</code> 、<code>java.lang.Float<
/code> などです。 |
| 2480 </p> |
| 2481 |
| 2482 |
| 2483 <h3><a name="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE">RCN: すでに利用していた値の nul
l チェック (RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE)</a></h3> |
| 2484 |
| 2485 |
| 2486 <p> |
| 2487 ここで値が null なのかチェックしていますが、すでに値を利用していたので null である可能性はありません。 |
| 2488 値が null なら以前の利用で NullPointerException が発生していたでしょう。 |
| 2489 基本的に、値が null であることを許すのかどうかに関係なく、このコードと以前の値の利用は一致しません。 |
| 2490 チェックは冗長か、または以前の値の利用は誤りです。 |
| 2491 </p> |
| 2492 |
| 2493 |
| 2494 <h3><a name="RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION">RE: 正規表現のための無効な構文 (RE_BAD_SYN
TAX_FOR_REGULAR_EXPRESSION)</a></h3> |
| 2495 |
| 2496 |
| 2497 <p> |
| 2498 このコードは、正規表現の構文によると無効である正規表現を使用しています。 |
| 2499 この文が実行されるとき PatternSyntaxException をスローします。 |
| 2500 </p> |
| 2501 |
| 2502 |
| 2503 <h3><a name="RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION">RE: 正規表現のために使われてい
る File.separator (RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION)</a></h3> |
| 2504 |
| 2505 |
| 2506 <p> |
| 2507 このコードは、正規表現が必要とされる場所で、<code>File.separator</code> を使用しています。 |
| 2508 これは <code>File.separator</code> がバックスラッシュである Windows プラットホームでは失敗します。 |
| 2509 バックスラッシュは正規表現ではエスケープ文字として解釈されます。 |
| 2510 その他の選択肢としては、<code>File.separator</code> の代わりに <code>File.separatorChar=='\\' ? "
\\\\" : File.separator</code> を使用できます。 |
| 2511 </p> |
| 2512 |
| 2513 |
| 2514 <h3><a name="RE_POSSIBLE_UNINTENDED_PATTERN">RE: 正規表現のために使われている "." または "|" (RE_
POSSIBLE_UNINTENDED_PATTERN)</a></h3> |
| 2515 |
| 2516 |
| 2517 <p> |
| 2518 String 機能が呼び出されていて、"." または "|" が引数として正規表現を取るパラメータに渡されています。 |
| 2519 これは、意図したことですか? |
| 2520 たとえば |
| 2521 </p> |
| 2522 <ul> |
| 2523 <li><code>s.replaceAll(".", "/")</code> は、すべての文字が '/' 文字に置換された String を返す</li> |
| 2524 <li><code>s.split(".")</code> は、常に長さが0の String 配列を返す</li> |
| 2525 <li><code>"ab|cd".replaceAll("|", "/")</code> は、<code>"/a/b/|/c/d/"</code> を返す
</li> |
| 2526 <li><code>"ab|cd".split("|")</code> は、6個の要素がある配列を返す: <code>[, a, b, |, c, d]</
code></li> |
| 2527 </ul> |
| 2528 |
| 2529 |
| 2530 <h3><a name="RV_01_TO_INT">RV: 0から1の乱数値は整数値0に丸められる (RV_01_TO_INT)</a></h3> |
| 2531 |
| 2532 |
| 2533 <p> |
| 2534 0から1の乱数値は整数値0に丸められます。 |
| 2535 おそらく整数に丸められる前に何か他のことによって乱数値を倍数にしたかったか、または <code>Random.nextInt(n)</code> メソッドを使い
たかったのでしょう。 |
| 2536 </p> |
| 2537 |
| 2538 |
| 2539 <h3><a name="RV_ABSOLUTE_VALUE_OF_HASHCODE">RV: 符号付き32ビットハッシュコードの絶対値を計算する間違った試み
(RV_ABSOLUTE_VALUE_OF_HASHCODE)</a></h3> |
| 2540 |
| 2541 |
| 2542 <p> |
| 2543 このコードは、ハッシュコードを生成して絶対値を計算しています。 |
| 2544 ハッシュコードが <code>Integer.MIN_VALUE</code> なら結果は同様に負です (<code>Math.abs(Integer.MIN_
VALUE) == Integer.MIN_VALUE</code> なので)。 |
| 2545 </p> |
| 2546 <p> |
| 2547 文字列の2^32個に1個は <code>Integer.MIN_VALUE</code> のハッシュコードを持っていて、「polygenelubricants」
、「GydZG_」、「DESIGNING WORKHOUSES」が該当します。 |
| 2548 </p> |
| 2549 |
| 2550 |
| 2551 <h3><a name="RV_ABSOLUTE_VALUE_OF_RANDOM_INT">RV: 符号付き整数の乱数の絶対値を計算する間違った試み (RV_A
BSOLUTE_VALUE_OF_RANDOM_INT)</a></h3> |
| 2552 |
| 2553 |
| 2554 <p> |
| 2555 このコードは、符号付き整数の乱数を生成して絶対値を計算しています。 |
| 2556 乱数ジェネレータで返される数が <code>Integer.MIN_VALUE</code> なら結果は同様に負です (<code>Math.abs(Integ
er.MIN_VALUE) == Integer.MIN_VALUE</code> なので)。 |
| 2557 (同じ問題は long 値でも同様に起きます)。 |
| 2558 </p> |
| 2559 |
| 2560 |
| 2561 <h3><a name="RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE">RV: compareTo によって返され
た特定の値のコードチェック (RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE)</a></h3> |
| 2562 |
| 2563 |
| 2564 <p> |
| 2565 このコードは、compareTo または compare メソッドを呼び出して、戻り値が特定の値(たとえば1または-1) なのか確かめています。 |
| 2566 これらのメソッドを呼び出すときは特定のゼロ以外の値ではなく、結果の符号だけをチェックするべきです。 |
| 2567 多数または大部分の compareTo と比較メソッドは-1、0または1を返しますが、いくつかは他の値を返します。 |
| 2568 </p> |
| 2569 |
| 2570 |
| 2571 <h3><a name="RV_EXCEPTION_NOT_THROWN">RV: 作成した例外をスローするのではなく捨てている (RV_EXCEPTION_N
OT_THROWN)</a></h3> |
| 2572 |
| 2573 |
| 2574 <p> |
| 2575 このコードは、例外 (またはエラー) オブジェクトを作成していますが、何もしていません。<br> |
| 2576 たとえば以下のようなコードです。 |
| 2577 </p> |
| 2578 <blockquote><pre> |
| 2579 if (x < 0) { |
| 2580 new IllegalArgumentException("x must be nonnegative"); |
| 2581 } |
| 2582 </pre></blockquote> |
| 2583 <p> |
| 2584 おそらくプログラマの意図は、作成した例外をスローすることでした。 |
| 2585 </p> |
| 2586 <blockquote><pre> |
| 2587 if (x < 0) { |
| 2588 throw new IllegalArgumentException("x must be nonnegative"); |
| 2589 } |
| 2590 </pre></blockquote> |
| 2591 |
| 2592 |
| 2593 <h3><a name="RV_RETURN_VALUE_IGNORED">RV: 戻り値を無視しているメソッド (RV_RETURN_VALUE_IGNORE
D)</a></h3> |
| 2594 |
| 2595 |
| 2596 <p> |
| 2597 このメソッドの戻り値はチェックするべきです。 |
| 2598 この警告の共通の原因は、オブジェクトが更新されると思って不変オブジェクトのメソッドを呼び出すことです。<br> |
| 2599 たとえば以下のようなコードです。 |
| 2600 </p> |
| 2601 <blockquote><pre> |
| 2602 String dateString = getHeaderField(name); |
| 2603 dateString.trim(); |
| 2604 </pre></blockquote> |
| 2605 <p> |
| 2606 プログラマは、<code>trim</code> メソッドが <code>dateString</code> によって参照される String オブジェクトが更
新されると思っています。 |
| 2607 しかし、String オブジェクトは不変で、<code>trim</code> メソッドが新しい String オブジェクトを返すのに無視しています。 |
| 2608 このコードは、以下のように修正するべきです。 |
| 2609 </p> |
| 2610 <blockquote><pre> |
| 2611 String dateString = getHeaderField(name); |
| 2612 dateString = dateString.trim(); |
| 2613 </pre></blockquote> |
| 2614 |
| 2615 |
| 2616 <h3><a name="RpC_REPEATED_CONDITIONAL_TEST">RpC: 条件テストの繰り返し (RpC_REPEATED_CONDIT
IONAL_TEST)</a></h3> |
| 2617 |
| 2618 |
| 2619 <p> |
| 2620 このコードには条件テストが2回、つまり、1つめの条件テストが正しいとき、2つめの条件テストが実行されます (たとえば、<code>x == 0 || x ==
0</code>)。 |
| 2621 多分、2つめの条件テストは何か他のことを意図しています (たとえば、<code>x == 0 || y == 0</code>)。 |
| 2622 </p> |
| 2623 |
| 2624 |
| 2625 <h3><a name="SA_FIELD_SELF_ASSIGNMENT">SA: フィールドの自己代入 (SA_FIELD_SELF_ASSIGNMENT)
</a></h3> |
| 2626 |
| 2627 |
| 2628 <p> |
| 2629 このメソッドにはフィールドの自己代入があります。<br> |
| 2630 たとえば以下のようなコードです。 |
| 2631 </p> |
| 2632 <blockquote><pre> |
| 2633 int x; |
| 2634 public void foo() { |
| 2635 x = x; |
| 2636 } |
| 2637 </pre></blockquote> |
| 2638 <p> |
| 2639 そのような代入は役に立たないので、論理エラーかタイプミスかもしれません。 |
| 2640 </p> |
| 2641 |
| 2642 |
| 2643 <h3><a name="SA_FIELD_SELF_COMPARISON">SA: フィールドとそれ自身との自己比較 (SA_FIELD_SELF_COMPA
RISON)</a></h3> |
| 2644 |
| 2645 |
| 2646 <p> |
| 2647 このメソッドは、フィールドをそれ自身と比較しています。 |
| 2648 論理エラーかタイプミスかもしれません。正しいものを比較していることを確認してください。 |
| 2649 </p> |
| 2650 |
| 2651 |
| 2652 <h3><a name="SA_FIELD_SELF_COMPUTATION">SA: フィールドの無意味な自己演算 (たとえば、 x & x) (SA_FIE
LD_SELF_COMPUTATION)</a></h3> |
| 2653 |
| 2654 |
| 2655 <p> |
| 2656 このメソッドは、フィールドと同じフィールドへの別の参照との無意味な計算を実行しています (たとえば、x & x または x - x)。 |
| 2657 この計算の性質のため、演算は意味をなすとは思われないので、論理エラーかタイプミスかもしれません。 |
| 2658 計算をチェックしてください。 |
| 2659 </p> |
| 2660 |
| 2661 |
| 2662 <h3><a name="SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD">SA: フィールドへの代入ではなくローカル変数へ
の自己代入 (SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD)</a></h3> |
| 2663 |
| 2664 |
| 2665 <p> |
| 2666 このメソッドにはローカル変数の自己代入があり、ローカル変数とフィールドが同じ名前です。<br> |
| 2667 たとえば以下のようなコードです。 |
| 2668 </p> |
| 2669 <blockquote><pre> |
| 2670 int foo; |
| 2671 public void setFoo(int foo) { |
| 2672 foo = foo; |
| 2673 } |
| 2674 </pre></blockquote> |
| 2675 <p> |
| 2676 そのような代入は役に立ちません。そうではなく、フィールドに代入するつもりでしたか? |
| 2677 </p> |
| 2678 |
| 2679 |
| 2680 <h3><a name="SA_LOCAL_SELF_COMPARISON">SA: ローカル変数とそれ自身との自己比較 (SA_LOCAL_SELF_COMP
ARISON)</a></h3> |
| 2681 |
| 2682 |
| 2683 <p> |
| 2684 このメソッドは、ローカル変数をそれ自身と比較しています。論理エラーかタイプミスかもしれません。 |
| 2685 正しいものを比較していることを確認してください。 |
| 2686 </p> |
| 2687 |
| 2688 |
| 2689 <h3><a name="SA_LOCAL_SELF_COMPUTATION">SA: 変数の無意味な自己演算 (たとえば、x & x) (SA_LOCAL_S
ELF_COMPUTATION)</a></h3> |
| 2690 |
| 2691 |
| 2692 <p> |
| 2693 このメソッドは、ローカル変数と同じ変数への別の参照との無意味な計算を実行しています (たとえば、x & x または x - x)。 |
| 2694 この計算の性質のため、演算は意味をなすとは思われないので、論理エラーかタイプミスかもしれません。 |
| 2695 計算をダブルチェックしてください。 |
| 2696 </p> |
| 2697 |
| 2698 |
| 2699 <h3><a name="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH">SF: switch 文のフォールスルーのために格納
が無効になっている (SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH)</a></h3> |
| 2700 |
| 2701 |
| 2702 <p> |
| 2703 前の case で格納された値が switch 文のフォールスルーのためにここで上書きされています。 |
| 2704 前の case の終わりに break または return を入れるのを忘れた可能性があります。 |
| 2705 </p> |
| 2706 |
| 2707 |
| 2708 <h3><a name="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW">SF: スローする switch
文のフォールスルーのために格納が無効になっている (SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW)</a><
/h3> |
| 2709 |
| 2710 |
| 2711 <p> |
| 2712 前の case で格納された値が例外がスローされる場所で、switch 文のフォールスルーのためにここで失われています。 |
| 2713 前の case の終わりに break または return を入れるのを忘れた可能性があります。 |
| 2714 </p> |
| 2715 |
| 2716 |
| 2717 <h3><a name="SIC_THREADLOCAL_DEADLY_EMBRACE">SIC: 非 static 内部クラスとスレッドローカルのデッドロック
(SIC_THREADLOCAL_DEADLY_EMBRACE)</a></h3> |
| 2718 |
| 2719 |
| 2720 <p> |
| 2721 このクラスは内部クラスですが、おそらく static 内部クラスにすべきです。 |
| 2722 実際には内部クラスと外部クラスのスレッドローカルとの間にデッドロックの深刻な危険性があります。 |
| 2723 内部クラスが static でないので、外部クラスへの参照を保持します。 |
| 2724 スレッドローカルに内部クラスのインスタンスの参照があるなら、内部と外部のインスタンスの両方が到達可能になり、ガベージされません。 |
| 2725 </p> |
| 2726 |
| 2727 |
| 2728 <h3><a name="SIO_SUPERFLUOUS_INSTANCEOF">SIO: instanceof 演算子を使用した不必要な型チェック (SIO_
SUPERFLUOUS_INSTANCEOF)</a></h3> |
| 2729 |
| 2730 |
| 2731 <p> |
| 2732 オブジェクトが要求する型であるかどうかにかかわらず、静的に確定している可能性があるのに instanceof 演算子を使用して型チェックをしています。 |
| 2733 </p> |
| 2734 |
| 2735 |
| 2736 <h3><a name="SQL_BAD_PREPARED_STATEMENT_ACCESS">SQL: インデックスが0で PreparedStatement
にアクセスしようとしているメソッド (SQL_BAD_PREPARED_STATEMENT_ACCESS)</a></h3> |
| 2737 |
| 2738 |
| 2739 <p> |
| 2740 インデックスが0で、<code>PreparedStatement</code> の setXXX メソッドを呼び出しています。 |
| 2741 インデックスは1から開始するので、これは常に間違いです。 |
| 2742 </p> |
| 2743 |
| 2744 |
| 2745 <h3><a name="SQL_BAD_RESULTSET_ACCESS">SQL: インデックスが0で ResultSet にアクセスしようとしているメソッ
ド (SQL_BAD_RESULTSET_ACCESS)</a></h3> |
| 2746 |
| 2747 |
| 2748 <p> |
| 2749 インデックスが0で、<code>ResultSet</code> の getXXX、updateXXX メソッドを呼び出しています。 |
| 2750 <code>ResultSet</code> のインデックスは1から開始するので、これは常に間違いです。 |
| 2751 </p> |
| 2752 |
| 2753 |
| 2754 <h3><a name="STI_INTERRUPTED_ON_CURRENTTHREAD">STI: interrupted メソッドを呼び出すために不要な
currentThread メソッドを呼び出している (STI_INTERRUPTED_ON_CURRENTTHREAD)</a></h3> |
| 2755 |
| 2756 |
| 2757 <p> |
| 2758 このメソッドは、<code>interrupted</code> メソッドを呼び出すために <code>Thread.currentThread()</code
> を呼び出しています。 |
| 2759 <code>interrupted</code> メソッドは static メソッドなので、<code>Thread.interrupted()</code>
を使用するほうが単純明解です。 |
| 2760 </p> |
| 2761 |
| 2762 |
| 2763 <h3><a name="STI_INTERRUPTED_ON_UNKNOWNTHREAD">STI: スレッドインスタンスで static Thread.in
terrupted() を呼び出している (STI_INTERRUPTED_ON_UNKNOWNTHREAD)</a></h3> |
| 2764 |
| 2765 |
| 2766 <p> |
| 2767 このメソッドは、カレントスレッドでない Thread オブジェクトであるように見える Thread オブジェクトで <code>Thread.interrupt
ed()</code> を呼び出しています。 |
| 2768 <code>interrupted</code> メソッドは static なので、作成者が意図したこととは異なるオブジェクトで呼び出されます。 |
| 2769 </p> |
| 2770 |
| 2771 |
| 2772 <h3><a name="SE_METHOD_MUST_BE_PRIVATE">Se: 直列化機構のために private にしなければならないメソッド (SE
_METHOD_MUST_BE_PRIVATE)</a></h3> |
| 2773 |
| 2774 |
| 2775 <p> |
| 2776 このクラスは、<code>Serializable</code> インタフェースを実装して、カスタム直列化/直列化復元のためのメソッドを定義しています。 |
| 2777 しかし、そのメソッドが private として宣言されていないので、直列化/直列化復元 API によって無視されます。 |
| 2778 </p> |
| 2779 |
| 2780 |
| 2781 <h3><a name="SE_READ_RESOLVE_IS_STATIC">Se: readResolve メソッドが static メソッドとして宣言され
ている (SE_READ_RESOLVE_IS_STATIC)</a></h3> |
| 2782 |
| 2783 |
| 2784 <p> |
| 2785 <code>readResolve</code> メソッドが直列化機構で認識されるためには static メソッドとして宣言してはいけません。 |
| 2786 </p> |
| 2787 |
| 2788 |
| 2789 <h3><a name="TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED">TQ: 型修飾子でアノテーションされた値がその修
飾子を付けてはならない値を必要とする場所で使われている (TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED)</a></h3> |
| 2790 |
| 2791 |
| 2792 <p> |
| 2793 型修飾子であのてーとされた値がその修飾子を付けてはならない値を必要とする場所で使われています。 |
| 2794 </p> |
| 2795 <p> |
| 2796 より正確に、when=ALWAYS を指定した型修飾子でアノテートされた値が到達することが保証されているか同じ型修飾子で when=NEVER を指定する場所で
使用しています。 |
| 2797 </p> |
| 2798 <p> |
| 2799 たとえば、@NonNegative が型修飾子アノテーション @Negative(when=When.NEVER) の略称だとします。 |
| 2800 以下のコードは、return 文が @NonNegative 値を要求するが @Negative としてマークされている値を受け取るのでこの警告を生成します。 |
| 2801 </p> |
| 2802 <blockquote><pre> |
| 2803 public @NonNegative Integer example(@Negative Integer value) { |
| 2804 return value; |
| 2805 } |
| 2806 </pre></blockquote> |
| 2807 |
| 2808 |
| 2809 <h3><a name="TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_QUALIFIERS">TQ: 互換性のない型修
飾子による比較値 (TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_QUALIFIERS)</a></h3> |
| 2810 |
| 2811 |
| 2812 <p> |
| 2813 型修飾子アノテーションを指定した値がその修飾子のない値と比較しています。 |
| 2814 </p> |
| 2815 <p> |
| 2816 より正確に、when=ALWAYS を指定した型修飾子でアノテートされた値が同じ型修飾子で when=NEVER を指定する値と比較しています。 |
| 2817 </p> |
| 2818 <p> |
| 2819 たとえば、@NonNegative が型修飾子アノテーション @Negative(when=When.NEVER) の略称だとします。 |
| 2820 以下のコードは、return 文が @NonNegative 値を要求するが、@Negative としてマークされている値を受け取るのでこの警告を生成します。 |
| 2821 </p> |
| 2822 <blockquote><pre> |
| 2823 public boolean example(@Negative Integer value1, @NonNegative Integer value2) { |
| 2824 return value1.equals(value2); |
| 2825 } |
| 2826 </pre></blockquote> |
| 2827 |
| 2828 |
| 2829 <h3><a name="TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK">TQ: 型修飾子を付けていないかもしれない値がそ
の型修飾子を必要とする方法で常に使われている (TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK)</a></h3> |
| 2830 |
| 2831 |
| 2832 <p> |
| 2833 型修飾子によって示された値のインスタンスではない可能性としてアノテートされた値です。 |
| 2834 値は、その型修飾子によって示された値を必要とする方法で使われることが保証されています。 |
| 2835 </p> |
| 2836 |
| 2837 |
| 2838 <h3><a name="TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK">TQ: 型修飾子を付けているかもしれない値がその型
修飾子を禁止する方法で常に使われている (TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK)</a></h3> |
| 2839 |
| 2840 |
| 2841 <p> |
| 2842 型修飾子によって示された値のインスタンスである可能性としてアノテートされた値です。 |
| 2843 値は、その型修飾子によって示された値を禁止する方法で使われることが保証されています。 |
| 2844 </p> |
| 2845 |
| 2846 |
| 2847 <h3><a name="TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED">TQ: 型修飾子でアノテートされていない値がその
修飾子が付けられた値を必要とする場所で使われている (TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED)</a></h3> |
| 2848 |
| 2849 |
| 2850 <p> |
| 2851 型修飾子でアノテートされていない値がその修飾子が付けられた値を必要とする場所で使われています。 |
| 2852 </p> |
| 2853 <p> |
| 2854 より正確に、when=NEVER を指定した型修飾子でアノテートされた値が同じ型修飾子で when=ALWAYS を指定する場所で使用しています。 |
| 2855 </p> |
| 2856 |
| 2857 |
| 2858 <h3><a name="TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_REQUIRED">TQ: 型修飾子がない値が
修飾子を必要とする場所で使われている (TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_REQUIRED)</a></h
3> |
| 2859 |
| 2860 |
| 2861 <p> |
| 2862 値が型修飾子アノテーションを必要とする方法で使われています。型修飾子は厳密なので、ツールは適切なアノテーションを指定していない値を拒絶します。 |
| 2863 </p> |
| 2864 <p> |
| 2865 厳密なアノテーションを指定しているので値を型変換します。戻り値が厳密なアノテーションでアノテートされる同一性機能を定義してください。 |
| 2866 これは、厳密な型修飾子アノテーションで非アノテート値を値に変える唯一の方法です。 |
| 2867 </p> |
| 2868 |
| 2869 |
| 2870 <h3><a name="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS">UMAC: 呼び出し不可能なメソッドが無名クラス
で定義されている (UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS)</a></h3> |
| 2871 |
| 2872 |
| 2873 <p> |
| 2874 この無名クラスは、直接呼び出されないスーパークラスのメソッドをオーバーライドしていないメソッドを定義しています。 |
| 2875 他のクラスのメソッドが無名クラスで宣言されたメソッドを直接呼び出せないので、このメソッドは呼び出し不可能であると思われます。 |
| 2876 メソッドは単にデッドコードであるかもしれません。しかし、メソッドがスーパークラスで宣言されるメソッドをオーバーライドすることを意図した可能性もあります。 |
| 2877 そして、タイプミスまたは他の誤りのために、メソッドは、実際、それが意図されるメソッドをオーバーライドしません。 |
| 2878 </p> |
| 2879 |
| 2880 |
| 2881 <h3><a name="UR_UNINIT_READ">UR: コンストラクタで初期化されていないフィールドを読み出している (UR_UNINIT_READ)
</a></h3> |
| 2882 |
| 2883 |
| 2884 <p> |
| 2885 このコンストラクタは、まだ値が代入されていないフィールドを読み出しています。 |
| 2886 多くの場合、プログラマがコンストラクタのパラメータの代わりに誤ってフィールドを使用するときに起きます。 |
| 2887 </p> |
| 2888 |
| 2889 |
| 2890 <h3><a name="UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR">UR: スーパークラスのコンストラクタから
呼び出されるメソッドで初期化されていないフィールドを読み出している (UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR)
</a></h3> |
| 2891 |
| 2892 |
| 2893 <p> |
| 2894 このメソッドは、スーパークラスのコンストラクタで呼びされています。この時点では、クラスのフィールドはまだ初期化されていません。 |
| 2895 </p> |
| 2896 <p> |
| 2897 これはたくさんの具象クラスを作るためです。以下のクラスを検討してください。 |
| 2898 </p> |
| 2899 <blockquote><pre> |
| 2900 abstract class A { |
| 2901 int hashCode; |
| 2902 abstract Object getValue(); |
| 2903 |
| 2904 A() { |
| 2905 hashCode = getValue().hashCode(); |
| 2906 } |
| 2907 } |
| 2908 |
| 2909 class B extends A { |
| 2910 Object value; |
| 2911 |
| 2912 B(Object v) { |
| 2913 this.value = v; |
| 2914 } |
| 2915 |
| 2916 Object getValue() { |
| 2917 return value; |
| 2918 } |
| 2919 } |
| 2920 </pre></blockquote> |
| 2921 <p> |
| 2922 <code>B</code> が構築されるとき、<code>B</code> のコンストラクタが <code>value</code> に値を設定する前に、<c
ode>A</code> クラスのコンストラクタが呼び出されます。 |
| 2923 したがって、<code>A</code> のコンストラクタが <code>getValue</code> を呼び出すとき、<code>value</code>
の初期化されていない値が読み出されます。 |
| 2924 </p> |
| 2925 |
| 2926 |
| 2927 |
| 2928 <h3><a name="DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY">USELESS_STRING: 名前のない配列で
toString メソッドを呼び出している (DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY)</a></h3> |
| 2929 |
| 2930 |
| 2931 <p> |
| 2932 このコードは、無名の配列で <code>toString</code> メソッドを呼び出しています。「[C@16f0472」のようなかなり役に立たない結果を生成
します。 |
| 2933 配列のコンテンツを与え、読める文字列に変換するために、<code>Arrays.toString()</code> を使うことを検討してください。<br> |
| 2934 『Programming Puzzlers』の第3章、パズル12を参照してください。 |
| 2935 </p> |
| 2936 |
| 2937 |
| 2938 <h3><a name="DMI_INVOKING_TOSTRING_ON_ARRAY">USELESS_STRING: 配列で toString メソッドを呼
び出している (DMI_INVOKING_TOSTRING_ON_ARRAY)</a></h3> |
| 2939 |
| 2940 |
| 2941 <p> |
| 2942 このコードは、配列で <code>toString</code> メソッドを呼び出しています。「[C@16f0472」のようなかなり役に立たない結果を生成します
。 |
| 2943 配列のコンテンツを与え、読める文字列に変換するために、<code>Arrays.toString()</code> を使うことを検討してください。<br> |
| 2944 『Programming Puzzlers』の第3章、パズル12を参照してください。 |
| 2945 </p> |
| 2946 |
| 2947 |
| 2948 <h3><a name="VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY">USELESS_STRING: 書式文字列を使
用して役に立たない方法で配列をフォーマットしている (VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY)</a></h3> |
| 2949 |
| 2950 |
| 2951 <p> |
| 2952 書式文字列でフォーマットされている引数の1つは配列です。 |
| 2953 これは [I@304282 のようなかなり役に立たない書式を使用してフォーマットされます。それは配列のコンテンツを表示しません。 |
| 2954 フォーマットで扱う前に <code>Arrays.asList(...)</code> を使用して配列をラップすることを検討してください。 |
| 2955 </p> |
| 2956 |
| 2957 |
| 2958 <h3><a name="UWF_NULL_FIELD">UwF: null に設定されるだけのフィールド (UWF_NULL_FIELD)</a></h3> |
| 2959 |
| 2960 |
| 2961 <p> |
| 2962 このフィールドに定数値 null を書き込みます。したがって、フィールドの読み出しは null を返します。 |
| 2963 誤りをチェックしてください。使わないなら除去してください。 |
| 2964 </p> |
| 2965 |
| 2966 |
| 2967 <h3><a name="UWF_UNWRITTEN_FIELD">UwF: 書き込まれていないフィールド (UWF_UNWRITTEN_FIELD)</a><
/h3> |
| 2968 |
| 2969 |
| 2970 <p> |
| 2971 このフィールドは決して書き込まれません。このフィールドからの読み出しはデフォルト値を返します。 |
| 2972 誤りをチェックしてください (フィールドは初期化するべきでしたか?)。使わないなら除去してください。 |
| 2973 </p> |
| 2974 |
| 2975 |
| 2976 <h3><a name="VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG">VA: 可変長引数を期待しているメソッドにプリ
ミティブ型の配列を渡している (VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG)</a></h3> |
| 2977 |
| 2978 |
| 2979 <p> |
| 2980 このコードは可変長引数をとるメソッドにプリミティブ型の配列を渡しています。 |
| 2981 これは、プリミティブ型の配列を保持するために長さが1の配列を作成してメソッドに渡します。 |
| 2982 </p> |
| 2983 |
| 2984 |
| 2985 <h3><a name="LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE">LG: ロガーの変更は OpenJDK の弱参照が原因で潜
在的に失われる (LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)</a></h3> |
| 2986 |
| 2987 |
| 2988 <p> |
| 2989 OpenJDK は、潜在的非互換性を取り入れました。特に、<code>java.util.logging.Logger</code> は振る舞いが変更されていま
す。 |
| 2990 強参照を使用する代わりに、現在、内部的に弱参照を使用しています。 |
| 2991 それは理にかなった変更ですが、残念ながらいくつかのコードは古い振る舞いに依存しています。 |
| 2992 ロガーの構成を変更するとき、ロガーへの参照を捨てます。 |
| 2993 つまり、ガベージコレクタはそのメモリを回収できます。それは、ロガーの構成が失われることを意味します。<br> |
| 2994 たとえば、以下を検討してください。 |
| 2995 </p> |
| 2996 <blockquote><pre> |
| 2997 public static void initLogging() throws Exception { |
| 2998 Logger logger = Logger.getLogger("edu.umd.cs"); |
| 2999 logger.addHandler(new FileHandler()); // ロガーの構成の変更 |
| 3000 logger.setUseParentHandlers(false); // 別のロガーの構成の変更 |
| 3001 } |
| 3002 </pre></blockquote> |
| 3003 <p> |
| 3004 ロガーの参照は、メソッドの終わり (メソッドは脱出しません) で失われるので、 |
| 3005 <code>initLogging</code> の呼び出しの後でガベージコレクションの循環があるなら、ロガー構成は失われます (なぜなら Logger は弱参
照を保持するだけなので)。 |
| 3006 </p> |
| 3007 <blockquote><pre> |
| 3008 public static void main(String[] args) throws Exception { |
| 3009 initLogging(); // ファイルハンドラーをロガーに追加する |
| 3010 System.gc(); // ロガーの構成が失われる |
| 3011 Logger.getLogger("edu.umd.cs").info("Some message"); // 期待したようにファイルに記録されません |
| 3012 } |
| 3013 </pre></blockquote> |
| 3014 <p> |
| 3015 Ulf Ochsenfahrt と Eric Fellheimer |
| 3016 </p> |
| 3017 |
| 3018 |
| 3019 <h3><a name="OBL_UNSATISFIED_OBLIGATION">OBL: ストリームやリソースのクリーンアップに失敗するかもしれないメソッド
(OBL_UNSATISFIED_OBLIGATION)</a></h3> |
| 3020 |
| 3021 |
| 3022 <p> |
| 3023 このメソッドは、ストリーム、データベースオブジェクト、または明示的にクリーンアップ操作を必要としている他のリソースのクリーンアップ (クローズする、片付ける)
に失敗するかもしれません。 |
| 3024 </p> |
| 3025 <p> |
| 3026 一般に、メソッドがストリープや他のリソースを開いたなら、メソッドはストリームやリソースがメソッドが戻る前にクリーンアップされることを確認するために、try/fi
nally ブロックを使用するべきです。 |
| 3027 </p> |
| 3028 <p> |
| 3029 このバグパターンは、OS_OPEN_STREAM と ODR_OPEN_DATABASE_RESOURCE と基本的に同じですが異なる (そして、うまくいけばよ
り良い) 静的解析技術に基づいています。 |
| 3030 私たちは、このバグパターンの有効性についてのフィードバックを得ることに関心があります。 |
| 3031 どちらかの方法でフィードバックを送ってください。 |
| 3032 </p> |
| 3033 <ul> |
| 3034 <li>send email to findbugs@cs.umd.edu</li> |
| 3035 <li>file a bug report: <a href="http://findbugs.sourceforge.net/reportingBugs.
html">http://findbugs.sourceforge.net/reportingBugs.html</a></li> |
| 3036 </ul> |
| 3037 <p> |
| 3038 特に、このバグパターンの誤検出抑制探索法は詳細にわたって調整されていないので、誤検出についてのレポートは我々の助けになります。 |
| 3039 </p> |
| 3040 <p> |
| 3041 解析技術の説明は、Weimer と Necula による <i>Finding and Preventing Run-Time Error Handling M
istakes</i> を参照してください。 |
| 3042 </p> |
| 3043 |
| 3044 |
| 3045 <h3><a name="OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE">OBL: チェック例外でストリームやリソースのク
リーンアップに失敗するかもしれないメソッド (OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE)</a></h3> |
| 3046 |
| 3047 |
| 3048 <p> |
| 3049 このメソッドは、ストリーム、データベースオブジェクト、または明示的にクリーンアップ操作を必要としている他のリソースのクリーンアップ (クローズする、片付ける)
に失敗するかもしれません。 |
| 3050 </p> |
| 3051 <p> |
| 3052 一般に、メソッドがストリープや他のリソースを開いたなら、メソッドはストリームやリソースがメソッドが戻る前にクリーンアップされることを確認するために、try/fi
nally ブロックを使用するべきです。 |
| 3053 </p> |
| 3054 <p> |
| 3055 このバグパターンは、OS_OPEN_STREAM と ODR_OPEN_DATABASE_RESOURCE と基本的に同じですが異なる (そして、うまくいけばよ
り良い) 静的解析技術に基づいています。 |
| 3056 私たちは、このバグパターンの有効性についてのフィードバックを得ることに関心があります。 |
| 3057 どちらかの方法でフィードバックを送ってください。 |
| 3058 </p> |
| 3059 <ul> |
| 3060 <li>send email to findbugs@cs.umd.edu</li> |
| 3061 <li>file a bug report: <a href="http://findbugs.sourceforge.net/reportingBugs.
html">http://findbugs.sourceforge.net/reportingBugs.html</a></li> |
| 3062 </ul> |
| 3063 <p> |
| 3064 特に、このバグパターンの誤検出抑制探索法は詳細にわたって調整されていないので、誤検出についてのレポートは我々の助けになります。 |
| 3065 </p> |
| 3066 <p> |
| 3067 解析技術の説明は、Weimer と Necula による <i>Finding and Preventing Run-Time Error Handling M
istakes</i> を参照してください。 |
| 3068 </p> |
| 3069 |
| 3070 |
| 3071 <h3><a name="DM_CONVERT_CASE">Dm: 呼び出したメソッドの Locale パラメータの使用を検討する (DM_CONVERT_CA
SE)</a></h3> |
| 3072 |
| 3073 |
| 3074 <p> |
| 3075 文字列がプラットホームのデフォルトエンコーディングを使用して大文字、小文字に変換されています。 |
| 3076 国際文字で使われると不適切な変換になるかもしれません。 |
| 3077 </p> |
| 3078 <ul> |
| 3079 <li>String.toUpperCase(Locale l)</li> |
| 3080 <li>String.toLowerCase(Locale l)</li> |
| 3081 </ul> |
| 3082 |
| 3083 |
| 3084 <h3><a name="DM_DEFAULT_ENCODING">Dm: デフォルトエンコーディングへの依存 (DM_DEFAULT_ENCODING)</a
></h3> |
| 3085 |
| 3086 |
| 3087 <p> |
| 3088 byte から String (または String から byte) への変換で、デフォルトプラットホームエンコーディングが適切であると仮定するメソッドの呼び
出しを発見しました。 |
| 3089 これは、アプリケーションの振る舞いがプラットホーム間で異なる原因となります。代替 API を使用して、明示的に文字セット名または Charset オブジェクトを
指定して下さい。 |
| 3090 </p> |
| 3091 |
| 3092 |
| 3093 <h3><a name="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED">DP: doPrivileged ブロック内で
作成されるべきクラスローダ (DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED)</a></h3> |
| 3094 |
| 3095 |
| 3096 <p> |
| 3097 このコードはクラスローダを作成していますが、セキュリティ管理がインストールされるなら許可が必要です。 |
| 3098 このコードがセキュリティ許可がないコードによって呼び出されるなら、クラスローダの作成は doPrivileged ブロックの中で行う必要があります。 |
| 3099 </p> |
| 3100 |
| 3101 |
| 3102 <h3><a name="DP_DO_INSIDE_DO_PRIVILEGED">DP: doPrivileged ブロック内で呼び出すべきメソッド (DP_D
O_INSIDE_DO_PRIVILEGED)</a></h3> |
| 3103 |
| 3104 |
| 3105 <p> |
| 3106 このコードは、セキュリティ許可チェックが必要なメソッドを呼び出しています。 |
| 3107 このコードにセキュリティ許可が与えられるとしても、セキュリティ許可を持たないコードによって呼び出されるなら doPrivileged ブロックの中で呼び出す必要
があります。 |
| 3108 </p> |
| 3109 |
| 3110 |
| 3111 <h3><a name="EI_EXPOSE_REP">EI: 可変オブジェクトへの参照を返すことによって内部表現を暴露するかもしれないメソッド (EI_EXP
OSE_REP)</a></h3> |
| 3112 |
| 3113 |
| 3114 <p> |
| 3115 オブジェクトのフィールドに格納された可変オブジェクトの参照を返すと、オブジェクトの内部表現を暴露します。 |
| 3116 インスタンスが信頼できないコードによってアクセスされるなら、可変オブジェクトのチェックされていない変更がセキュリティや他の重要なプロパティを危うくするでしょう。 |
| 3117 何か違うことをする必要があります。オブジェクトの新しいコピーを返すことは、多くの状況でより良いアプローチです。 |
| 3118 </p> |
| 3119 |
| 3120 |
| 3121 <h3><a name="EI_EXPOSE_REP2">EI2: 可変オブジェクトへの参照を取り込むことによって内部表現を暴露するかもしれないメソッド (EI
_EXPOSE_REP2)</a></h3> |
| 3122 |
| 3123 |
| 3124 <p> |
| 3125 このコードは、オブジェクトの内部表現に外部の可変オブジェクトの参照を格納しています。 |
| 3126 インスタンスが信頼できないコードによってアクセスされるなら、可変オブジェクトのチェックされていない変更がセキュリティや他の重要なプロパティを危うくするでしょう。 |
| 3127 何か違うことをする必要があります。オブジェクトの新しいコピーを返すことは、多くの状況でより良いアプローチです。 |
| 3128 </p> |
| 3129 |
| 3130 |
| 3131 <h3><a name="FI_PUBLIC_SHOULD_BE_PROTECTED">FI: ファイナライザは public ではなく protected に
すべき (FI_PUBLIC_SHOULD_BE_PROTECTED)</a></h3> |
| 3132 |
| 3133 |
| 3134 <p> |
| 3135 このクラスの <code>finalize</code> メソッドは public ではなく、protected にすべきです。 |
| 3136 </p> |
| 3137 |
| 3138 |
| 3139 <h3><a name="EI_EXPOSE_STATIC_REP2">MS: static フィールドに可変オブジェクトを格納することによって、内部の静的状態
を暴露するかもしれないメソッド (EI_EXPOSE_STATIC_REP2)</a></h3> |
| 3140 |
| 3141 |
| 3142 <p> |
| 3143 このコードは、static フィールドに外部の可変オブジェクトを格納しています。 |
| 3144 可変オブジェクトのチェックされていない変更がセキュリティや他の重要なプロパティを危うくするでしょう。 |
| 3145 何か違うことをする必要があります。オブジェクトのコピーを保存することは、多くの状況でより良いアプローチです。 |
| 3146 </p> |
| 3147 |
| 3148 |
| 3149 <h3><a name="MS_CANNOT_BE_FINAL">MS: final でないフィールドは悪質なコードから保護できない (MS_CANNOT_BE
_FINAL)</a></h3> |
| 3150 |
| 3151 |
| 3152 <p> |
| 3153 この可変 static フィールドは、悪質なコードや偶然別のパッケージによって変更される可能性があります。 |
| 3154 残念ながらこのような使い方は簡単に解決できません。 |
| 3155 </p> |
| 3156 |
| 3157 |
| 3158 <h3><a name="MS_EXPOSE_REP">MS: 配列を返すことによって内部表現を暴露するかもしれない public static メソッド (M
S_EXPOSE_REP)</a></h3> |
| 3159 |
| 3160 |
| 3161 <p> |
| 3162 public static メソッドは、クラスの 静的な状態の一部である配列の参照を返します。 |
| 3163 このメソッドを呼び出すどんなコードも、基底配列を自由に変更できます。 |
| 3164 解決策は、配列のコピーを返すことです。 |
| 3165 </p> |
| 3166 |
| 3167 |
| 3168 <h3><a name="MS_FINAL_PKGPROTECT">MS: final かつパッケージプロテクテッドにすべきフィールド (MS_FINAL_PK
GPROTECT)</a></h3> |
| 3169 |
| 3170 |
| 3171 <p> |
| 3172 この可変 static フィールドは、悪質なコードや偶然別のパッケージによって変更される可能性があります。 |
| 3173 フィールドは、脆弱性を回避するために final および/またはパッケージプロテクテッドにします。 |
| 3174 </p> |
| 3175 |
| 3176 |
| 3177 <h3><a name="MS_MUTABLE_ARRAY">MS: 可変配列のフィールド (MS_MUTABLE_ARRAY)</a></h3> |
| 3178 |
| 3179 |
| 3180 <p> |
| 3181 この final static フィールドは、配列を参照しているので、悪質なコードや偶然別のパッケージによってアクセスされる可能性があります。 |
| 3182 このコードは、配列のコンテンツを自由に変更できます。 |
| 3183 </p> |
| 3184 |
| 3185 |
| 3186 <h3><a name="MS_MUTABLE_HASHTABLE">MS: 可変 Hashtable のフィールド (MS_MUTABLE_HASHTABLE
)</a></h3> |
| 3187 |
| 3188 |
| 3189 <p> |
| 3190 この final static フィールドは、Hashtable を参照しているので、悪質なコードや偶然別のパッケージによってアクセスされる可能性があります。 |
| 3191 このコードは、Hashtable のコンテンツを自由に変更できます。 |
| 3192 </p> |
| 3193 |
| 3194 |
| 3195 <h3><a name="MS_OOI_PKGPROTECT">MS: インタフェースから移動してパッケージプロテクテッドにすべきフィールド (MS_OOI_P
KGPROTECT)</a></h3> |
| 3196 |
| 3197 |
| 3198 <p> |
| 3199 インタフェースに定義された final static フィールドが、配列や Hashtable などの可変オブジェクトを参照しています。 |
| 3200 この可変オブジェクトは、悪質なコードや偶然別のパッケージによって変更される可能性があります。 |
| 3201 これを解決するために、フィールドはクラスへ移動する必要があり、脆弱性を回避するためにパッケージプロテクテッドにします。 |
| 3202 </p> |
| 3203 |
| 3204 |
| 3205 <h3><a name="MS_PKGPROTECT">MS: パッケージプロテクテッドにすべきフィールド (MS_PKGPROTECT)</a></h3> |
| 3206 |
| 3207 |
| 3208 <p> |
| 3209 この可変 static フィールドは、悪質なコードや偶然別のパッケージによって変更される可能性があります。 |
| 3210 フィールドは、脆弱性を回避するためにパッケージプロテクテッドにします。 |
| 3211 </p> |
| 3212 |
| 3213 |
| 3214 <h3><a name="MS_SHOULD_BE_FINAL">MS: final にすべきフィールド (MS_SHOULD_BE_FINAL)</a></h
3> |
| 3215 |
| 3216 |
| 3217 <p> |
| 3218 final でない public static フィールドは、悪質なコードや偶然別のパッケージによって変更される可能性があります。 |
| 3219 フィールドは、脆弱性を回避するために final にします。 |
| 3220 </p> |
| 3221 |
| 3222 |
| 3223 <h3><a name="MS_SHOULD_BE_REFACTORED_TO_BE_FINAL">MS: final でないフィールドはリファクタリングするべ
き (MS_SHOULD_BE_REFACTORED_TO_BE_FINAL)</a></h3> |
| 3224 |
| 3225 |
| 3226 <p> |
| 3227 final でない public static フィールドは、悪質なコードや偶然別のパッケージによって変更される可能性があります。 |
| 3228 フィールドは、脆弱性を回避するために final にします。 |
| 3229 しかしながら、スタティックイニシャライザには複数のフィールドへの書き込みがあるので、何らかのリファクタリングを必要とするでしょう。 |
| 3230 </p> |
| 3231 |
| 3232 |
| 3233 <h3><a name="AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION">AT: 並行抽象の呼び出しシーケンス
はアトミックではないかもしれない (AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION)</a></h3> |
| 3234 |
| 3235 |
| 3236 <p> |
| 3237 このコードには並行抽象化 (たとえば、並行ハッシュマップ) の呼び出しシーケンスがあります。 |
| 3238 これらの呼び出しは原子的に実行されません。 |
| 3239 </p> |
| 3240 |
| 3241 |
| 3242 <h3><a name="DC_DOUBLECHECK">DC: フィールドのダブルチェックの可能性 (DC_DOUBLECHECK)</a></h3> |
| 3243 |
| 3244 |
| 3245 <p> |
| 3246 このメソッドにはダブルチェックロッキングのインスタンスがあるかもしれません。このイディオムは、Java のメモリモデルでは正しくありません。<br> |
| 3247 詳細は、<a href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.h
tml" >http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html</a>
を参照してください。 |
| 3248 </p> |
| 3249 |
| 3250 |
| 3251 <h3><a name="DL_SYNCHRONIZATION_ON_BOOLEAN">DL: Boolean の同期化 (DL_SYNCHRONIZATION
_ON_BOOLEAN)</a></h3> |
| 3252 |
| 3253 |
| 3254 <p> |
| 3255 <code>Boolean</code> のようなボクシングされたプリミティブ型の定数で同期化しています。 |
| 3256 </p> |
| 3257 <blockquote><pre> |
| 3258 private static Boolean inited = Boolean.FALSE; |
| 3259 |
| 3260 synchronized(inited) { |
| 3261 if (!inited) { |
| 3262 init(); |
| 3263 inited = Boolean.TRUE; |
| 3264 } |
| 3265 } |
| 3266 </pre></blockquote> |
| 3267 <p> |
| 3268 一般には2つの <code>Boolean</code> オブジェクトだけが存在しています。 |
| 3269 このコードは他の無関係なコードと同じオブジェクトで同期化している可能性があるので、無応答やデッドロックの原因になります。 |
| 3270 </p> |
| 3271 |
| 3272 |
| 3273 <h3><a name="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE">DL: デッドロックの原因になる可能性があるボクシングさ
れたプリミティブ型の同期化 (DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE)</a></h3> |
| 3274 |
| 3275 |
| 3276 <p> |
| 3277 このコードは、Integer のようなボクシングされたプリミティブ型の定数で同期化しています。 |
| 3278 </p> |
| 3279 <blockquote><pre> |
| 3280 private static Integer count = 0; |
| 3281 |
| 3282 synchronized(count) { |
| 3283 count++; |
| 3284 } |
| 3285 </pre></blockquote> |
| 3286 <p> |
| 3287 <code>Integer</code> オブジェクトはキャッシュして共有される可能性があります。 |
| 3288 他の無関係なコードと同じオブジェクトで同期化している可能性があるので、無応答やデッドロックの原因になります。 |
| 3289 </p> |
| 3290 <p> |
| 3291 CERT の <a href="https://www.securecoding.cert.org/confluence/display/java/CON08-
J.+Do+not+synchronize+on+objects+that+may+be+reused">CON08-J. Do not synchronize
on objects that may be reused</a> を参照してください。 |
| 3292 </p> |
| 3293 |
| 3294 |
| 3295 <h3><a name="DL_SYNCHRONIZATION_ON_SHARED_CONSTANT">DL: 正準化した文字列の同期化 (DL_SYNCHRO
NIZATION_ON_SHARED_CONSTANT)</a></h3> |
| 3296 |
| 3297 |
| 3298 <p> |
| 3299 このコードは、正準化した文字列で同期化しています。 |
| 3300 </p> |
| 3301 <blockquote><pre> |
| 3302 private static String LOCK = "LOCK"; |
| 3303 |
| 3304 synchronized(LOCK) { |
| 3305 ... |
| 3306 } |
| 3307 </pre></blockquote> |
| 3308 <p> |
| 3309 文字列定数は正準化され、Java 仮想マシンによってロードされたすべてのクラス全体で共有されます。 |
| 3310 したがって、これは他のコードがロックしているかもしれない何かをロックしている可能性があります。 |
| 3311 これはブロッキングとデッドロックの振る舞いの診断を難しくして、とても奇妙な結果になる可能性があります。 <br> |
| 3312 詳細は、<a href="http://www.javalobby.org/java/forums/t96352.html">http://www.javalo
bby.org/java/forums/t96352.html</a> と <a href="http://jira.codehaus.org/browse/J
ETTY-352">http://jira.codehaus.org/browse/JETTY-352</a> を参照してください。 |
| 3313 </p> |
| 3314 |
| 3315 |
| 3316 <h3><a name="DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE">DL: ボクシングされたプリミティブ値
の同期化 (DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE)</a></h3> |
| 3317 |
| 3318 |
| 3319 <p> |
| 3320 このコードは、明らかに共有されていない <code>Integer</code> のようなボクシングされたプリミティブ型で同期化しています。 |
| 3321 </p> |
| 3322 <blockquote><pre> |
| 3323 private static final Integer fileLock = new Integer(1); |
| 3324 |
| 3325 synchronized(fileLock) { |
| 3326 .. do something .. |
| 3327 } |
| 3328 </pre></blockquote> |
| 3329 <p> |
| 3330 このコードは、 fileLock を以下のように宣言するとより良くなります。 |
| 3331 </p> |
| 3332 <blockquote><pre> |
| 3333 private static final Object fileLock = new Object(); |
| 3334 </pre></blockquote> |
| 3335 <p> |
| 3336 既存のコードとしては間違っていないのかもしれませんが、紛らわしいので将来リファクタリングするべきかもしれません。 |
| 3337 たとえば、IntelliJ の "Remove Boxing" のようなリファクタリングは Java 仮想マシンを通して共有される正準化された <code>In
teger</code> オブジェクトを使用するように置き換えてしまい、非常に紛らわしい振る舞いと潜在的デッドロックの原因になります。 |
| 3338 </p> |
| 3339 |
| 3340 |
| 3341 <h3><a name="DM_MONITOR_WAIT_ON_CONDITION">Dm: Condition で wait メソッドを呼び出している (DM
_MONITOR_WAIT_ON_CONDITION)</a></h3> |
| 3342 |
| 3343 |
| 3344 <p> |
| 3345 このメソッドは、<code>java.util.concurrent.locks.Condition</code> オブジェクトで <code>wait</co
de> メソッドを呼び出しています。 |
| 3346 <code>Condition</code> オブジェクトを待機させるためには <code>Condition</code> インタフェースで定義された <co
de>await</code> メソッドを使用するべきです。 |
| 3347 </p> |
| 3348 |
| 3349 |
| 3350 <h3><a name="DM_USELESS_THREAD">Dm: デフォルトの空の run メソッドを使用して作成されたスレッド (DM_USELESS_
THREAD)</a></h3> |
| 3351 |
| 3352 |
| 3353 <p> |
| 3354 このメソッドは、<code>Thread</code> クラスから派生した <code>run</code> メソッドを指定していないか、<code>Runna
ble</code> オブジェクトを渡すことなく、スレッドを作成しています。 |
| 3355 このスレッドは、時間の無駄です。 |
| 3356 </p> |
| 3357 |
| 3358 |
| 3359 <h3><a name="ESync_EMPTY_SYNC">ESync: 空の synchronized ブロック (ESync_EMPTY_SYNC)</a
></h3> |
| 3360 |
| 3361 |
| 3362 <p> |
| 3363 このコードには空の synchronized ブロックがあります。 |
| 3364 </p> |
| 3365 <blockquote><pre> |
| 3366 synchronized() { |
| 3367 } |
| 3368 </pre></blockquote> |
| 3369 <p> |
| 3370 空の synchronized ブロックは巧妙で正しく使用するのは困難です。 |
| 3371 空の synchronized ブロックはわざとらしくて決して良い解決策ではありません。 |
| 3372 </p> |
| 3373 |
| 3374 |
| 3375 <h3><a name="IS2_INCONSISTENT_SYNC">IS: 一貫性のない同期化 (IS2_INCONSISTENT_SYNC)</a></h
3> |
| 3376 |
| 3377 |
| 3378 <p> |
| 3379 このクラスのフィールドは、同期化に関して一貫性なくアクセスされるように見えます。 |
| 3380 このバグレポートは、バグパターンディテクタが以下のように判断したことを示します。 |
| 3381 </p> |
| 3382 <ul> |
| 3383 <li>クラスは、ロックされたアクセスとアンロックされたアクセスが混在していて</li> |
| 3384 <li>クラスは、javax.annotation.concurrent.NotThreadSafe としてアノテートされません</li> |
| 3385 <li>少なくとも1つのロックされたアクセスがクラス自身のメソッドの1つによって実行され、</li> |
| 3386 <li>読み出しの2倍の重み付けをした書き込みで、非同期フィールドのアクセス (読み出しと書き込み) 数がすべてのアクセスのわずか1/3</li> |
| 3387 </ul> |
| 3388 <p |
| 3389 このバグパターンに合致する典型的なバグは、スレッドセーフを意図したクラスでメソッドを同期化させることを忘れていることです。 |
| 3390 </p> |
| 3391 <p> |
| 3392 ディテクタがどこでフィールドが同期化なしでアクセスされると信じていたかを示すコードの場所に「非同期アクセス」というラベルがついているノードを選択できます。 |
| 3393 </p> |
| 3394 <p> |
| 3395 不正確ないろいろな原因がこのディテクタにあることに注意してください。 |
| 3396 たとえば、ディテクタはロックを保持されるすべての状況を静的に検出できるというわけではありません。 |
| 3397 また、ディテクタがロックされたアクセスとアンロックされたアクセスの区別が正確なときでも、問題のコードは依然として正しいかもしれません。 |
| 3398 </p> |
| 3399 |
| 3400 |
| 3401 <h3><a name="IS_FIELD_NOT_GUARDED">IS: 並行アクセスに対してガードされていないフィールド (IS_FIELD_NOT_GU
ARDED)</a></h3> |
| 3402 |
| 3403 |
| 3404 <p> |
| 3405 このフィールドは、net.jcip.annotations.GuardedBy または javax.annotation.concurrent.GuardedB
y でアノテートされていますが、アノテーションに違反すると思われる方法でアクセスできます。 |
| 3406 </p> |
| 3407 |
| 3408 |
| 3409 <h3><a name="JLM_JSR166_LOCK_MONITORENTER">JLM: Lock で同期化している (JLM_JSR166_LOCK_M
ONITORENTER)</a></h3> |
| 3410 |
| 3411 |
| 3412 <p> |
| 3413 このメソッドは、<code>java.util.concurrent.locks.Lock</code> を実装したオブジェクトで同期化しています。 |
| 3414 そのようなオブジェクトは <code>synchronized (...)</code> 構文よりも <code>acquire()</code>/<code>
release()</code> を使用してロックとロックの解除をします。 |
| 3415 </p> |
| 3416 |
| 3417 |
| 3418 <h3><a name="JLM_JSR166_UTILCONCURRENT_MONITORENTER">JLM: java.util.concurrent の
インスタンスで同期化している (JLM_JSR166_UTILCONCURRENT_MONITORENTER)</a></h3> |
| 3419 |
| 3420 |
| 3421 <p> |
| 3422 このメソッドは、java.util.concurrent パッケージのクラス (またはサブクラス) のインスタンスで同期化しています。 |
| 3423 これらのクラスのインスタンスは、<code>synchronized</code> の使用とは違う互換性のないそれら自身の並行制御メカニズムを持っています。 |
| 3424 たとえば、<code>AtomicBoolean</code> で同期しても、他のスレッドが <code>AtomicBoolean</code> を変更するの
を防ぎません。 |
| 3425 </p> |
| 3426 <p> |
| 3427 そのようなコードは正しいかもしれないが、将来コードを維持しなければならない人々を混乱させるかもしれないので慎重にレビューし文書化するべきです、 |
| 3428 </p> |
| 3429 |
| 3430 |
| 3431 <h3><a name="JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT">JLM: util.concurrent 抽象で
モニタスタイルの wait メソッドを使用している (JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT)</a></h3> |
| 3432 |
| 3433 |
| 3434 <p> |
| 3435 このメソッドは、<code>await()</code> メソッド、<code>signal</code> メソッド、<code>signalAll</code
> メソッドを提供するオブジェクト |
| 3436 (たとえば、util.concurrent の Condition オブジェクト) で、<code>wait</code> メソッド、<code>notify<
/code> メソッド、<code>notifyAll</code> メソッドを呼び出しています。 |
| 3437 これはおそらくあなたが望むことではありません。たとえそれを望むとしても、他の開発者が非常に紛らわしいことを理解して、設計を変更することを検討するべきです。 |
| 3438 </p> |
| 3439 |
| 3440 |
| 3441 <h3><a name="LI_LAZY_INIT_STATIC">LI: static フィールドの間違った遅延初期化 (LI_LAZY_INIT_STATI
C)</a></h3> |
| 3442 |
| 3443 |
| 3444 <p> |
| 3445 このメソッドにはvolatile でない static フィールドの非同期な遅延初期化があります。 |
| 3446 コンパイラやプロセッサが命令を並べ替えるかもしれないので、メソッドが複数のスレッドによって呼び出されるかもしれないなら、 |
| 3447 スレッドは完全に初期化されたオブジェクトを見るとは保証されていません。 |
| 3448 フィールドにアクセスした際に、中途半端に初期化されたインスタンスが見えてしまう危険があります。 |
| 3449 この問題を修正するために、フィールドを volatile にできます。<br> |
| 3450 詳細は、<a href="http://www.cs.umd.edu/~pugh/java/memoryModel/">Java Memory Model we
b site</a> を参照してください。 |
| 3451 </p> |
| 3452 |
| 3453 |
| 3454 <h3><a name="LI_LAZY_INIT_UPDATE_STATIC">LI: 更新される static フィールドの間違った遅延初期化 (LI_LA
ZY_INIT_UPDATE_STATIC)</a></h3> |
| 3455 |
| 3456 |
| 3457 <p> |
| 3458 このメソッドにはstatic フィールドの非同期な遅延初期化があります。 |
| 3459 フィールドが設定された後で、その場所に格納されるオブジェクトはさらに更新されるかアクセスされます。 |
| 3460 それが設定されるとすぐに、フィールドの設定は他のスレッドに見えます。 |
| 3461 フィールドを設定するさらなるアクセスがオブジェクトを初期化するのに役に立つなら、 |
| 3462 それが完全に初期化されるまでどんな他のスレッドも格納されたオブジェクトにアクセスするのを防がないかぎり、非常に深刻なマルチスレッドバグがあります。 |
| 3463 </p> |
| 3464 <p> |
| 3465 たとえメソッドが複数のスレッドによって決して呼び出されないと確信していても、 |
| 3466 それは、フィールドに設定している値が完全にデータを読み込まれるか初期化されるまで、 static フィールドを設定しないほうが良いかもしれません。 |
| 3467 </p> |
| 3468 |
| 3469 |
| 3470 <h3><a name="ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD">ML: フィールドを同期化でガードしよう
とする無駄な試み (ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD)</a></h3> |
| 3471 |
| 3472 |
| 3473 <p> |
| 3474 このメソッドは、フィールドの同時更新に対して同期化でガードしようとしています。しかし、フィールドをガードするとフィールドではなく、フィールドが参照するオブジェク
トのロックを獲得します。 |
| 3475 これはあなたが必要とする相互排除を提供しないかもしれません。 |
| 3476 他のスレッドは (他の目的のための) 参照されたオブジェクトのロックを獲得するかもしれません。<br> |
| 3477 このパターンの例は以下のようになります。 |
| 3478 </p> |
| 3479 <blockquote><pre> |
| 3480 private Long myNtfSeqNbrCounter = new Long(0); |
| 3481 private Long getNotificationSequenceNumber() { |
| 3482 Long result = null; |
| 3483 synchronized(myNtfSeqNbrCounter) { |
| 3484 result = new Long(myNtfSeqNbrCounter.longValue() + 1); |
| 3485 myNtfSeqNbrCounter = new Long(result.longValue()); |
| 3486 } |
| 3487 return result; |
| 3488 } |
| 3489 </pre></blockquote> |
| 3490 |
| 3491 |
| 3492 <h3><a name="ML_SYNC_ON_UPDATED_FIELD">ML: 更新されるフィールドで同期化しているメソッド (ML_SYNC_ON_UP
DATED_FIELD)</a></h3> |
| 3493 |
| 3494 |
| 3495 <p> |
| 3496 このメソッドは、可変フィールドから参照されたオブジェクトで同期化しています。 |
| 3497 異なるスレッドが異なるオブジェクトで同期化しているかもしれないので、これは有効な意味を持っている可能性が低いです。 |
| 3498 </p> |
| 3499 |
| 3500 |
| 3501 <h3><a name="MSF_MUTABLE_SERVLET_FIELD">MSF: 可変サーブレットフィールド (MSF_MUTABLE_SERVLET_
FIELD)</a></h3> |
| 3502 |
| 3503 |
| 3504 <p> |
| 3505 Web サーバは、一般的にサーブレットや JSP クラスのインスタンスを1つだけ作成します (すなわち、シングルトンとして扱います)。 |
| 3506 複数のスレッドが複数同時に発生するリクエストを処理するためにインスタンスのメソッドを呼び出します。 |
| 3507 したがって、可変インスタンスフィールドは一般に競合状態を作成します。 |
| 3508 </p> |
| 3509 |
| 3510 |
| 3511 <h3><a name="MWN_MISMATCHED_NOTIFY">MWN: 不整合な notify メソッド (MWN_MISMATCHED_NOTIFY
)</a></h3> |
| 3512 |
| 3513 |
| 3514 <p> |
| 3515 このメソッドは、オブジェクトで明らかにロックを保持することなく <code>Object.notify()</code> や <code>Object.noti
fyAll()</code> を呼び出しています。 |
| 3516 保持されるロックがない状態で、<code>notify</code> メソッドや <code>notifyAll</code> メソッドを呼び出すことは、<co
de>IllegalMonitorStateException</code> をスローすることになります。 |
| 3517 </p> |
| 3518 |
| 3519 |
| 3520 <h3><a name="MWN_MISMATCHED_WAIT">MWN: 不整合な wait メソッド (MWN_MISMATCHED_WAIT)</a><
/h3> |
| 3521 |
| 3522 |
| 3523 <p> |
| 3524 このメソッドは、オブジェクトで明らかにロックを保持することなく、<code>Object.wait()</code> を呼び出しています。 |
| 3525 保持されるロックがない状態で、<code>wait</code> メソッドを呼び出すことは、<code>IllegalMonitorStateException
</code> をスローすることになります。 |
| 3526 </p> |
| 3527 |
| 3528 |
| 3529 <h3><a name="NN_NAKED_NOTIFY">NN: 裸の notify メソッド (NN_NAKED_NOTIFY)</a></h3> |
| 3530 |
| 3531 |
| 3532 <p> |
| 3533 <code>notify</code> メソッドまたは <code>notifyAll</code> メソッドへの呼び出しは可変オブジェクト状態にどんな (明ら
かな) 付随的な変更ももたらされませんでした。 |
| 3534 一般に、別のスレッドが期待しているいくつかの条件が真になったので、モニタで <code>notify</code> メソッドが呼び出されます。 |
| 3535 しかしながら、意味がある条件のために、両方のスレッドに見えるヒープオブジェクトを含まなければなりません。 |
| 3536 </p> |
| 3537 <p> |
| 3538 可変オブジェクトの状態変更が通知があるメソッドを呼び出したメソッドで起こったかもしれないので、このバグが必ずしもエラーを示すというわけではありません。 |
| 3539 </p> |
| 3540 |
| 3541 |
| 3542 <h3><a name="NP_SYNC_AND_NULL_CHECK_FIELD">NP: 同じフィールドでの同期化と null チェック (NP_SYNC_
AND_NULL_CHECK_FIELD)</a></h3> |
| 3543 |
| 3544 |
| 3545 <p> |
| 3546 フィールドは同期化しているので、おそらく null ではないと思われます。 |
| 3547 null のフィールドを同期化すると NullPointerException がスローされるので、null チェックは無意味になります。 |
| 3548 別のフィールドで同期化したほうがよいです。 |
| 3549 </p> |
| 3550 |
| 3551 |
| 3552 <h3><a name="NO_NOTIFY_NOT_NOTIFYALL">No: notifyAll メソッドではなく notify メソッドを使用している
(NO_NOTIFY_NOT_NOTIFYALL)</a></h3> |
| 3553 |
| 3554 |
| 3555 <p> |
| 3556 このメソッドは、<code>notifyAll</code> メソッドではなく <code>notify</code> メソッドを呼び出しています。 |
| 3557 モニタが複数の条件のために多くの場合使われます。 |
| 3558 <code>notify</code> メソッドの呼び出しは1つのスレッドを起こすだけで起こされたスレッドは呼び出し元が満たした待機条件の1つではないかもしれな
いことを意味しています。 |
| 3559 </p> |
| 3560 |
| 3561 |
| 3562 <h3><a name="RS_READOBJECT_SYNC">RS: readObject メソッドを同期化しているクラス (RS_READOBJECT_S
YNC)</a></h3> |
| 3563 |
| 3564 |
| 3565 <p> |
| 3566 この直列化可能クラスは同期化する <code>readObject</code> メソッド を定義していますが、 |
| 3567 直列化復元によって作成されるオブジェクトは1つのスレッドによってだけ到達可能です。 |
| 3568 したがって、<code>readObject</code> メソッドは同期化する必要がありません。 |
| 3569 <code>readObject</code> メソッドそのものが別のスレッドに見えるようになるオブジェクトの原因になっているなら非常に疑わしいコーディングスタ
イルの例です。 |
| 3570 </p> |
| 3571 |
| 3572 |
| 3573 <h3><a name="RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED">RV: putIfAbsent の戻り値は無視されて
putIfAbsent に渡した値は再利用された (RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED)</a></h3> |
| 3574 |
| 3575 |
| 3576 <p> |
| 3577 <code>putIfAbsent</code> メソッドは、一般に1つの値が与えられたキー (非存在が成功するかどうかの第一の値) と関連することを確認するた
めに使われます。 |
| 3578 戻り値を無視して中で渡される値への参照を保持するなら、マップのキーと関連する1つではない値を保持する危険性を冒します。 |
| 3579 どれを使用するかが重要であり、マップに格納できないものを使用すると、プログラムは誤った振る舞いをします。 |
| 3580 </p> |
| 3581 |
| 3582 |
| 3583 <h3><a name="RU_INVOKE_RUN">Ru: スレッドで run メソッドを呼び出している (RU_INVOKE_RUN)</a></h3> |
| 3584 |
| 3585 |
| 3586 <p> |
| 3587 このメソッドは、スレッドで 明示的に <code>run</code> メソッドを呼び出しています。 |
| 3588 一般に、クラスは新しいスレッドで自己の <code>run</code> メソッドを呼び出してもらうために <code>Runnable</code> インタフ
ェースを実装します。 |
| 3589 その場合は、<code>Thread.start()</code> を呼び出すのが正しいです。 |
| 3590 </p> |
| 3591 |
| 3592 |
| 3593 <h3><a name="SC_START_IN_CTOR">SC: Thread.start() を呼び出しているコンストラクタ (SC_START_IN_C
TOR)</a></h3> |
| 3594 |
| 3595 |
| 3596 <p> |
| 3597 コンストラクタがスレッドを開始しています。クラスが拡張され、サブクラスが作られるなら間違っていそうです。 |
| 3598 なぜなら、サブクラスのコンストラクタでスレッドが開始される前に、スーパークラスのスレッドが開始してしまうためです。 |
| 3599 </p> |
| 3600 |
| 3601 |
| 3602 <h3><a name="SP_SPIN_ON_FIELD">SP: スピンロックをしているメソッド (SP_SPIN_ON_FIELD)</a></h3> |
| 3603 |
| 3604 |
| 3605 <p> |
| 3606 このメソッドは、フィールドを読み出すループで回り続けます。 |
| 3607 コンパイラがフィールドの読み出しをループの外に出すかもしれません。コードを無限ループに変えます。 |
| 3608 正しい同期化 (wait/notify を呼び出すように含む) を使うようにクラスを変更するべきです。 |
| 3609 </p> |
| 3610 |
| 3611 |
| 3612 <h3><a name="STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE">STCAL: static Calendar の呼
び出し (STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE)</a></h3> |
| 3613 |
| 3614 |
| 3615 <p> |
| 3616 たとえ JavaDoc にそれに関する手がかりがないとしても、Calendar はマルチスレッドでの使用は本質的に安全ではありません。 |
| 3617 ディテクタは、static フィールドから得られた Calendar のインスタンスの呼び出しを発見しました。 |
| 3618 これは疑わしく見えます。 |
| 3619 詳細については、<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6231579">Sun
Bug #6231579</a> や <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=
6178997">Sun Bug #6178997</a> を参照してください。 |
| 3620 </p> |
| 3621 |
| 3622 |
| 3623 <h3><a name="STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE">STCAL: static DateForm
at の呼び出し (STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE)</a></h3> |
| 3624 |
| 3625 |
| 3626 <p> |
| 3627 JavaDoc に書かれているように、DateFormat はマルチスレッドでの使用は本質的に安全ではありません。 |
| 3628 ディテクタは、static フィールドから得られた DateFormat のインスタンスの呼び出しを発見しました。 |
| 3629 これは疑わしく見えます。 |
| 3630 詳細については、<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6231579">Sun
Bug #6231579</a> や <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=
6178997">Sun Bug #6178997</a> を参照してください。 |
| 3631 </p> |
| 3632 |
| 3633 |
| 3634 <h3><a name="STCAL_STATIC_CALENDAR_INSTANCE">STCAL: static Calendar フィールド (STCAL
_STATIC_CALENDAR_INSTANCE)</a></h3> |
| 3635 |
| 3636 |
| 3637 <p> |
| 3638 たとえ JavaDoc にそれに関する手がかりがないとしても、Calendar はマルチスレッドでの使用は本質的に安全でありません。 |
| 3639 正しい同期化をしないでスレッド境界の向こうで1つのインスタンスを共有することは、アプリケーションの誤動作になります。 |
| 3640 JDK 5.0に比べて JDK 1.4 のほうが問題が表面化するように思われ、おそらく sun.util.calendar.BaseCalendar.getCa
lendarDateFromFixedDate() の ArrayIndexOutOfBoundsExceptions や IndexOutOfBoundsEx
ceptions がランダムに発生します。 |
| 3641 直列化問題も経験するかもしれません。インスタンスフィールドを使うことを推奨します。<br> |
| 3642 詳細については、<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6231579">Sun
Bug #6231579</a> や <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=
6178997">Sun Bug #6178997</a> を参照してください。 |
| 3643 </p> |
| 3644 |
| 3645 |
| 3646 <h3><a name="STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE">STCAL: static DateFormat
(STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE)</a></h3> |
| 3647 |
| 3648 |
| 3649 <p> |
| 3650 JavaDoc に書かれているように、DateFormat はマルチスレッドでの使用は本質的に安全ではありません。 |
| 3651 正しい同期化をしないでスレッド境界の向こうで1つのインスタンスを共有することは、アプリケーションの誤動作になります。 |
| 3652 JDK 5.0に比べて JDK 1.4 のほうが問題が表面化するように思われ、おそらく sun.util.calendar.BaseCalendar.getCa
lendarDateFromFixedDate() の ArrayIndexOutOfBoundsExceptions や IndexOutOfBoundsEx
ceptions がランダムに発生します。 |
| 3653 直列化問題も経験するかもしれません。インスタンスフィールドを使うことを推奨します。<br> |
| 3654 詳細については、<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6231579">Sun
Bug #6231579</a> や <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=
6178997">Sun Bug #6178997</a> を参照してください。 |
| 3655 </p> |
| 3656 |
| 3657 |
| 3658 <h3><a name="SWL_SLEEP_WITH_LOCK_HELD">SWL: ロックを保持して Thread.sleep() を呼び出しているメソッド
(SWL_SLEEP_WITH_LOCK_HELD)</a></h3> |
| 3659 |
| 3660 |
| 3661 <p> |
| 3662 このメソッドは、ロックを保持して、<code>Thread.sleep()</code> を呼び出しています。 |
| 3663 他のスレッドがロックを獲得するために待機しているかもしれないので、ひどい性能とスケーラビリティ、またはデッドロックになるかもしれません。 |
| 3664 ロックで <code>wait</code> メソッドを呼び出すことはかなり良い考えで、ロックを解除して他のスレッドが実行するのを許可します。 |
| 3665 </p> |
| 3666 |
| 3667 |
| 3668 <h3><a name="TLW_TWO_LOCK_WAIT">TLW: 2つ以上のロックを保持して wait メソッドを呼び出している (TLW_TWO_LO
CK_WAIT)</a></h3> |
| 3669 |
| 3670 |
| 3671 <p> |
| 3672 2つ以上のロックを保持して、モニタで待機させるとデッドロックの原因になる場合があります。 |
| 3673 <code>wait</code> メソッドを呼び出すと、待機しているオブジェクトのロックを解除するだけで、その他のロックは解除しません。 |
| 3674 これは必ずしもバグではありませんが厳密に調べる価値があります。 |
| 3675 </p> |
| 3676 |
| 3677 |
| 3678 <h3><a name="UG_SYNC_SET_UNSYNC_GET">UG: 同期化していない get メソッド、同期化している set メソッド (UG_
SYNC_SET_UNSYNC_GET)</a></h3> |
| 3679 |
| 3680 |
| 3681 <p> |
| 3682 このクラスには類似した名前の get メソッドと set メソッドがあり、set メソッドは同期化していて、get メソッドは同期化していません。 |
| 3683 get メソッドの呼び出し元がオブジェクトの一貫した状態を必ずしも見るというわけではないので、実行時に間違った振る舞いになるかもしれません。 |
| 3684 get メソッドは同期化するべきです。 |
| 3685 </p> |
| 3686 |
| 3687 |
| 3688 <h3><a name="UL_UNRELEASED_LOCK">UL: すべての経路でロックが解除されないメソッド (UL_UNRELEASED_LOCK)<
/a></h3> |
| 3689 |
| 3690 |
| 3691 <p> |
| 3692 このメソッドは、JSR-166(<code>java.util.concurrent</code>) のロックを獲得していますが、メソッドからのすべての経路で解
除していません。 |
| 3693 一般に、JSR-166のロックを使用するための正しいイディオムは以下のようになります。 |
| 3694 </p> |
| 3695 <blockquote><pre> |
| 3696 Lock l = ...; |
| 3697 l.lock(); |
| 3698 try { |
| 3699 // do something |
| 3700 } finally { |
| 3701 l.unlock(); |
| 3702 } |
| 3703 </pre></blockquote> |
| 3704 |
| 3705 |
| 3706 <h3><a name="UL_UNRELEASED_LOCK_EXCEPTION_PATH">UL: すべての例外経路でロックが解除されないメソッド (UL_
UNRELEASED_LOCK_EXCEPTION_PATH)</a></h3> |
| 3707 |
| 3708 |
| 3709 <p> |
| 3710 このメソッドは、JSR-166(<code>java.util.concurrent</code>) のロックを獲得していますが、メソッドからのすべての例外経路
で解除していません。 |
| 3711 一般に、JSR-166のロックを使用するための正しいイディオムは以下のようになります。 |
| 3712 </p> |
| 3713 <blockquote><pre> |
| 3714 Lock l = ...; |
| 3715 l.lock(); |
| 3716 try { |
| 3717 // do something |
| 3718 } finally { |
| 3719 l.unlock(); |
| 3720 } |
| 3721 </pre></blockquote> |
| 3722 |
| 3723 |
| 3724 <h3><a name="UW_UNCOND_WAIT">UW: wait メソッドの無条件呼び出し (UW_UNCOND_WAIT)</a></h3> |
| 3725 |
| 3726 |
| 3727 <p> |
| 3728 このメソッドには条件制御フローによってガードされない <code>java.lang.Object.wait()</code> の呼び出しがあります。 |
| 3729 このコードは、<code>wait</code> メソッドを呼び出す前に待機するつもりだった条件がすでに満たされていないことを確かめるべきです。 |
| 3730 どんな前の通知も無視されます。 |
| 3731 </p> |
| 3732 |
| 3733 |
| 3734 <h3><a name="VO_VOLATILE_INCREMENT">VO: volatile フィールドへのインクリメントはアトミックではない (VO_VO
LATILE_INCREMENT)</a></h3> |
| 3735 |
| 3736 |
| 3737 <p> |
| 3738 このコードは、volatile フィールドをインクリメントしています。 |
| 3739 volatile フィールドのインクリメントはアトミックではありません。 |
| 3740 複数のスレッドが同時にフィールドをインクリメントすると、インクリメントが失われる可能性があります。 |
| 3741 </p> |
| 3742 |
| 3743 |
| 3744 <h3><a name="VO_VOLATILE_REFERENCE_TO_ARRAY">VO: 配列への volatile 参照は、配列要素を volatil
e として扱わない (VO_VOLATILE_REFERENCE_TO_ARRAY)</a></h3> |
| 3745 |
| 3746 |
| 3747 <p> |
| 3748 配列に volatile 参照を宣言していますが、あなたが望むものではないかもしれません。 |
| 3749 配列への volatile 参照は、配列への参照の読み出し、書き込みは volatile として扱われますが、配列要素は volatile として扱われません。 |
| 3750 配列要素を volatile として扱いたいのであれば、J2SE 5.0で提供された java.util.concurrent パッケージのアトミック配列クラス
を使用する必要があります。 |
| 3751 </p> |
| 3752 |
| 3753 |
| 3754 <h3><a name="WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL">WL: クラスリテラルではなく getCla
ss で同期化している (WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL)</a></h3> |
| 3755 |
| 3756 |
| 3757 <p> |
| 3758 このインスタンスメソッドは、<code>this.getClass()</code> で同期化しています。 |
| 3759 このクラスがサブクラス化されるなら、サブクラスはおそらく意図したことではないサブクラスのためにクラスオブジェクトで同期化します。 |
| 3760 たとえば、<code>java.awt.Label</code> の以下のコードを検討してください。 |
| 3761 </p> |
| 3762 <blockquote><pre> |
| 3763 private static final String base = "label"; |
| 3764 private static int nameCounter = 0; |
| 3765 |
| 3766 String constructComponentName() { |
| 3767 synchronized (getClass()) { |
| 3768 return base + nameCounter++; |
| 3769 } |
| 3770 } |
| 3771 </pre></blockquote> |
| 3772 <p> |
| 3773 <code>Label</code> のサブクラスは同じサブクラスで同期化しません。データレースを生じさせます。 |
| 3774 代わりに、このコードは、<code>Label.class</code> で同期化するべきです。 |
| 3775 </p> |
| 3776 <blockquote><pre> |
| 3777 private static final String base = "label"; |
| 3778 private static int nameCounter = 0; |
| 3779 |
| 3780 String constructComponentName() { |
| 3781 synchronized (Label.class) { |
| 3782 return base + nameCounter++; |
| 3783 } |
| 3784 } |
| 3785 </pre></blockquote> |
| 3786 <p> |
| 3787 Jason Mehrens によって寄贈されたバグパターン |
| 3788 </p> |
| 3789 |
| 3790 |
| 3791 <h3><a name="WS_WRITEOBJECT_SYNC">WS: writeObject メソッドは同期化しているがその他のメソッドは同期化していない
クラス (WS_WRITEOBJECT_SYNC)</a></h3> |
| 3792 |
| 3793 |
| 3794 <p> |
| 3795 このクラスには同期化している <code>writeObject</code> メソッドがあります。 |
| 3796 しかしながら、クラスのその他のメソッドは同期化していません。 |
| 3797 </p> |
| 3798 |
| 3799 |
| 3800 <h3><a name="WA_AWAIT_NOT_IN_LOOP">Wa: Condition.await() がループの中にない (WA_AWAIT_NOT
_IN_LOOP)</a></h3> |
| 3801 |
| 3802 |
| 3803 <p> |
| 3804 このメソッドは、ループの中にない <code>java.util.concurrent.await()</code> (またはそのバリエーション) を呼び出して
います。 |
| 3805 オブジェクトが複数の条件のために使われるなら、呼び出し元が待機するつもりだった条件は実際には発生しないかもしれません。 |
| 3806 </p> |
| 3807 |
| 3808 |
| 3809 <h3><a name="WA_NOT_IN_LOOP">Wa: wait メソッドがループの中にない (WA_NOT_IN_LOOP)</a></h3> |
| 3810 |
| 3811 |
| 3812 <p> |
| 3813 このメソッドは、ループの中にない <code>java.lang.Object.wait()</code> を呼び出しています。 |
| 3814 モニタが複数の条件のために使われるなら、呼び出し元が待機するつもりだった条件は実際には発生しないかもしれません。 |
| 3815 </p> |
| 3816 |
| 3817 |
| 3818 <h3><a name="BX_BOXING_IMMEDIATELY_UNBOXED">Bx: プリミティブ値がボクシングされて、すぐにアンボクシングされる (
BX_BOXING_IMMEDIATELY_UNBOXED)</a></h3> |
| 3819 |
| 3820 |
| 3821 <p> |
| 3822 プリミティブ値がボクシングされて、すぐにアンボクシングされます。 |
| 3823 おそらくアンボクシングされた値が必要な場所で、手動でボクシングをしているためです。 |
| 3824 その結果、コンパイラにボクシングの機能を取り消すことを強制しています。 |
| 3825 </p> |
| 3826 |
| 3827 |
| 3828 <h3><a name="BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION">Bx: プリミティブ値がプリミテ
ィブ型の型変換をするためにボクシングされて、アンボクシングされる (BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERC
ION)</a></h3> |
| 3829 |
| 3830 |
| 3831 <p> |
| 3832 プリミティブ値がコンストラクタでボクシングされて、すぐに異なるプリミティブ型に変換されます (たとえば <code>new Double(d).intValue
()</code>)。 |
| 3833 直接プリミティブ型の型変換を実行してください (たとえば <code>(int) d</code>)。 |
| 3834 </p> |
| 3835 |
| 3836 |
| 3837 <h3><a name="BX_UNBOXING_IMMEDIATELY_REBOXED">Bx: ボクシングされた値がアンボクシングされて、すぐに再ボクシング
される (BX_UNBOXING_IMMEDIATELY_REBOXED)</a></h3> |
| 3838 |
| 3839 |
| 3840 <p> |
| 3841 ボクシングされた値がアンボクシングされて、すぐに再ボクシングされます。 |
| 3842 </p> |
| 3843 |
| 3844 |
| 3845 <h3><a name="DM_BOXED_PRIMITIVE_FOR_PARSING">Bx: ボクシング/アンボクシングはプリミティブを解析する (DM_B
OXED_PRIMITIVE_FOR_PARSING)</a></h3> |
| 3846 |
| 3847 |
| 3848 <p> |
| 3849 ボックス化されたプリミティブは、String から生成されていて、アンボックス化されたプリミティブ値を抽出します。 |
| 3850 static parseXXX メソッドを呼び出す方が効率的です。 |
| 3851 </p> |
| 3852 |
| 3853 |
| 3854 <h3><a name="DM_BOXED_PRIMITIVE_TOSTRING">Bx: toString メソッドを呼び出すためにプリミティブ型のラッパクラ
スのインスタンスを作成している (DM_BOXED_PRIMITIVE_TOSTRING)</a></h3> |
| 3855 |
| 3856 |
| 3857 <p> |
| 3858 <code>toString</code> メソッドを呼び出すために、プリミティブ型のラッパクラスのインスタンスを作成しています。 |
| 3859 それよりもプリミティブ値を引数にとる static な <code>toString</code> メソッドを使用したほうが効率的です。 |
| 3860 </p> |
| 3861 <table> |
| 3862 <tr><th>置換前</th><th>置換後</th></tr> |
| 3863 <tr><td>new Integer(1).toString()</td><td>Integer.toString(1)</td></tr> |
| 3864 <tr><td>new Long(1).toString()</td><td>Long.toString(1)</td></tr> |
| 3865 <tr><td>new Float(1.0).toString()</td><td>Float.toString(1.0)</td></tr> |
| 3866 <tr><td>new Double(1.0).toString()</td><td>Double.toString(1.0)</td></tr> |
| 3867 <tr><td>new Byte(1).toString()</td><td>Byte.toString(1)</td></tr> |
| 3868 <tr><td>new Short(1).toString()</td><td>Short.toString(1)</td></tr> |
| 3869 <tr><td>new Boolean(true).toString()</td><td>Boolean.toString(true)</td></tr> |
| 3870 </table> |
| 3871 |
| 3872 |
| 3873 <h3><a name="DM_FP_NUMBER_CTOR">Bx: 効率が悪い浮動小数点 Number コンストラクタを呼び出しているメソッド (DM_FP
_NUMBER_CTOR)</a></h3> |
| 3874 |
| 3875 |
| 3876 <p> |
| 3877 <code>new Double(double)</code> の使用は、常に新しいブジェクトになることが保証されています。 |
| 3878 これに対して、<code>Double.valueOf(double)</code> は、コンパイラ、クラスライブラリ、Java 仮想マシンで値がキャッシュされ
ます。 |
| 3879 キャッシュに格納された値を使うことはインスタンス生成を回避し、コードはより高速になります。 |
| 3880 </p> |
| 3881 <p> |
| 3882 クラスが J2SE 5.0より前の Java 仮想マシンとの互換性が不要なら、オートボクシングか <code>Double</code>、<code>Float
</code> の <code>valueOf</code> メソッドを使用してください。 |
| 3883 </p> |
| 3884 |
| 3885 |
| 3886 <h3><a name="DM_NUMBER_CTOR">Bx: 効率が悪い Number コンストラクタを呼び出しているメソッド (DM_NUMBER_CTO
R)</a></h3> |
| 3887 |
| 3888 |
| 3889 <p> |
| 3890 <code>new Integer(int)</code> の使用は、常に新しいブジェクトになることが保証されています。 |
| 3891 これに対して、<code>Integer.valueOf(int)</code> は、コンパイラ、クラスライブラリ、Java 仮想マシンで値がキャッシュされます
。 |
| 3892 キャッシュに格納された値を使うことはインスタンスの作成を回避し、コードはより高速になります。 |
| 3893 </p> |
| 3894 <p> |
| 3895 -128から127までの値は対応するキャッシュされたインスタンスを持つことが保証されています。 |
| 3896 そして、<code>valueOf</code> メソッドの使用は、コンストラクタを使用するより約3.5倍高速です。 |
| 3897 定数範囲外の値は、両方のスタイルの性能は同じです。 |
| 3898 </p> |
| 3899 <p> |
| 3900 クラスが J2SE 5.0より前の Java 仮想マシンとの互換性が不要なら、<code>Long</code>、<code>Integer</code>、<c
ode>Short</code>、<code>Character</code>、<code>Byte</code> のインスタンスを作成するときは、オートボクシ
ングか <code>valueOf</code> メソッドを使用してください。 |
| 3901 </p> |
| 3902 |
| 3903 |
| 3904 <h3><a name="DMI_BLOCKING_METHODS_ON_URL">Dm: URL の equals メソッドと hashCode メソッドはブ
ロックする (DMI_BLOCKING_METHODS_ON_URL)</a></h3> |
| 3905 |
| 3906 |
| 3907 <p> |
| 3908 URL の <code>equals</code> メソッドと <code>hashCode</code> メソッドは、ドメイン名の解決を行うので、ひどい性能に
なる可能性があります。<br> |
| 3909 詳細は、<a href="http://michaelscharf.blogspot.com/2006/11/javaneturlequals-and-hash
code-make.html">http://michaelscharf.blogspot.com/2006/11/javaneturlequals-and-h
ashcode-make.html</a> を参照してください。<br> |
| 3910 その代わりに <code>java.net.URI</code> を使うことを検討してください。 |
| 3911 </p> |
| 3912 |
| 3913 |
| 3914 <h3><a name="DMI_COLLECTION_OF_URLS">Dm: URL の Map や Set はひどい性能になる可能性がある (DMI_CO
LLECTION_OF_URLS)</a></h3> |
| 3915 |
| 3916 |
| 3917 <p> |
| 3918 このメソッドまたはフィールドは、URL の <code>Map</code> か <code>Set</code> を使用しています。 |
| 3919 URL の <code>equals</code> と <code>hashCode</code> は、ドメイン名の解決を行うので、ひどい性能になる可能性があり
ます。<br> |
| 3920 詳細は、<a href="http://michaelscharf.blogspot.com/2006/11/javaneturlequals-and-hash
code-make.html">http://michaelscharf.blogspot.com/2006/11/javaneturlequals-and-h
ashcode-make.html</a> を参照してください。<br> |
| 3921 その代わりに <code>java.net.URI</code> を使うことをを検討してください。 |
| 3922 </p> |
| 3923 |
| 3924 |
| 3925 <h3><a name="DM_BOOLEAN_CTOR">Dm: 効率が悪い Boolean コンストラクタを呼び出しているメソッド (DM_BOOLEAN_
CTOR)</a></h3> |
| 3926 |
| 3927 |
| 3928 <p> |
| 3929 <code>java.lang.Boolean</code> の新しいインスタンスを作成するとメモリを浪費します。 |
| 3930 <code>Boolean</code> オブジェクトは不変で、2つの有効な値 (<code>Boolean.TRUE</code> と <code>Boole
an.FALSE</code>) があります。 |
| 3931 その代わりに <code>Boolean</code> オブジェクトを作成するために、<code>Boolean.valueOf</code> メソッド (また
は J2SE 5.0 のオートボクシング) を使用してください。 |
| 3932 </p> |
| 3933 |
| 3934 |
| 3935 <h3><a name="DM_GC">Dm: 明示的なガベージコレクション (DM_GC)</a></h3> |
| 3936 |
| 3937 |
| 3938 <p> |
| 3939 明示的にガベージコレクションを呼び出しています。ベンチマークの特定の用途を除いて非常に疑わしいです。 |
| 3940 </p> |
| 3941 <p> |
| 3942 過去に、<code>close</code> メソッドや <code>finalize</code> メソッドでガベージコレクタを明示的に呼び出していた状況は、
巨大なパフォーマンスブラックホールの原因となりました。 |
| 3943 ガベージコレクションは、高くつく可能性があります。何百、何千ものガベージコレクションを強制する状況は、システムの停滞をもたらすでしょう。 |
| 3944 </p> |
| 3945 |
| 3946 |
| 3947 <h3><a name="DM_NEW_FOR_GETCLASS">Dm: クラスオブジェクトを得るためだけにインスタンスを作成しているメソッド (DM_NEW
_FOR_GETCLASS)</a></h3> |
| 3948 |
| 3949 |
| 3950 <p> |
| 3951 メソッドは、クラスオブジェクトを得るために、インスタンスを生成して <code>getClass</code> メソッドを呼び出しています。 |
| 3952 クラスリテラル (<code>Foo.class</code>) を使うほうが簡単です。 |
| 3953 </p> |
| 3954 |
| 3955 |
| 3956 <h3><a name="DM_NEXTINT_VIA_NEXTDOUBLE">Dm: 整数の乱数を生成するためには nextDouble メソッド ではなく
nextInt メソッドを使用する (DM_NEXTINT_VIA_NEXTDOUBLE)</a></h3> |
| 3957 |
| 3958 |
| 3959 <p> |
| 3960 <code>java.util.Random</code> のインスタンス <code>r</code> で、<code>0</code> から <code>n
-1</code> の乱数を生成したいのであれば、<code>(int)(r.nextDouble() * n)</code> ではなく <code>r.nex
tInt(n)</code> を使用します。 |
| 3961 </p> |
| 3962 <p> |
| 3963 <code>nextInt</code> メソッドへの引数は整数でなければなりません。 |
| 3964 たとえば、-99から0までの乱数を生成したいなら、<code>-r.nextInt(100)</code> を使用してください。 |
| 3965 </p> |
| 3966 |
| 3967 |
| 3968 <h3><a name="DM_STRING_CTOR">Dm: 効率が悪い new String(String) コンストラクタを呼び出しているメソッド (D
M_STRING_CTOR)</a></h3> |
| 3969 |
| 3970 |
| 3971 <p> |
| 3972 <code>new String(String)</code> コンストラクタの使用はメモリを浪費します。 |
| 3973 そのようにして構築されたオブジェクトと パラメータとして渡された <code>String</code> は機能的に区別がつかないからです。 |
| 3974 引数の <code>String</code> をそのまま使用してください。 |
| 3975 </p> |
| 3976 |
| 3977 |
| 3978 <h3><a name="DM_STRING_TOSTRING">Dm: String の toString メソッドを呼び出しているメソッド (DM_STRI
NG_TOSTRING)</a></h3> |
| 3979 |
| 3980 |
| 3981 <p> |
| 3982 <code>String.toString()</code> を呼び出すのは冗長です。<code>String</code> を使用してください。 |
| 3983 </p> |
| 3984 |
| 3985 |
| 3986 <h3><a name="DM_STRING_VOID_CTOR">Dm: 効率が悪い new String() コンストラクタを呼び出しているメソッド (DM
_STRING_VOID_CTOR)</a></h3> |
| 3987 |
| 3988 |
| 3989 <p> |
| 3990 引数がないコンストラクタを使用して、新しい <code>java.lang.String()</code> オブジェクトを作成するとメモリを浪費します。 |
| 3991 そのようにして作成されたオブジェクトと空の文字列定数 <code>""</code> は機能的に区別がつかないからです。 |
| 3992 Javaは、同一の文字列定数が同じ <code>String</code> オブジェクトによって表されることを保証します。 |
| 3993 したがって、直接空の文字列定数を使用するべきです。 |
| 3994 </p> |
| 3995 |
| 3996 |
| 3997 <h3><a name="HSC_HUGE_SHARED_STRING_CONSTANT">HSC: 複数のクラスファイルにわたって複製されている巨大な文字列定
数 (HSC_HUGE_SHARED_STRING_CONSTANT)</a></h3> |
| 3998 |
| 3999 |
| 4000 <p> |
| 4001 巨大な文字列定数が複数のクラスファイルにわたって複製されています。 |
| 4002 final フィールドが文字列定数で初期化され、Java 言語によって他のクラスからの final フィールドへのすべての参照がクラスファイルにインライン化され
るからです。 |
| 4003 </p> |
| 4004 <p> |
| 4005 JDK はこのバグを解決してサイズを1MB減らすことができました。<br> |
| 4006 詳細は、<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6447475">JDK bug
6447475</a> を参照してください。 |
| 4007 </p> |
| 4008 |
| 4009 |
| 4010 <h3><a name="IIO_INEFFICIENT_INDEX_OF">IIO: String.indexOf(String) の非効率的な使用 (IIO
_INEFFICIENT_INDEX_OF)</a></h3> |
| 4011 |
| 4012 |
| 4013 <p> |
| 4014 このコードは、String.indexOf() に長さ1の文字列定数を渡しています。String.indexOf() の整数実装を使うほうが効率的です。 |
| 4015 たとえば、<code>myString.indexOf(".") の代わりに <code>myString.indexOf('.')</code> を呼び出しま
す。</code> |
| 4016 </p> |
| 4017 |
| 4018 |
| 4019 <h3><a name="IIO_INEFFICIENT_LAST_INDEX_OF">IIO: String.lastIndexOf(String) の非効率
的な使用 (IIO_INEFFICIENT_LAST_INDEX_OF)</a></h3> |
| 4020 |
| 4021 |
| 4022 <p> |
| 4023 このコードは、String.lastIndexOf() に長さ1の文字列定数を渡しています。String.lastIndexOf() の整数実装を使うほうが効率
的です。 |
| 4024 たとえば、<code>myString.lastIndexOf(".") の代わりに <code>myString.lastIndexOf('.')</code
> を呼び出します。</code> |
| 4025 </p> |
| 4026 |
| 4027 |
| 4028 <h3><a name="ITA_INEFFICIENT_TO_ARRAY">ITA: 長さが0の配列の引数で toArray メソッドを使用しているメソッド
(ITA_INEFFICIENT_TO_ARRAY)</a></h3> |
| 4029 |
| 4030 |
| 4031 <p> |
| 4032 このメソッドは、Collection 派生クラスの </code>toArray</code> メソッドを使用して長さが0の配列の引数を渡しています。 |
| 4033 <code>myCollection.toArray(new Foo[myCollection.size()])</code> を使用するほうがより効率的です。 |
| 4034 渡される配列がコレクションの要素のすべてを格納できるくらいの大きさなら、データが読み込まれて、そのまま返されます。 |
| 4035 これは、結果として返す2番目の配列 (リフレクションによって) を作成する必要を回避します。 |
| 4036 </p> |
| 4037 |
| 4038 |
| 4039 <h3><a name="SBSC_USE_STRINGBUFFER_CONCATENATION">SBSC: ループの中で + を使用して文字列を連結している
メソッド (SBSC_USE_STRINGBUFFER_CONCATENATION)</a></h3> |
| 4040 |
| 4041 |
| 4042 <p> |
| 4043 このメソッドは、ループの中で + を使用して <code>String</code> を構築していると思われます。 |
| 4044 各々の繰り返しにおいて、<code>String</code> は <code>StringBuffer</code>/<code>StringBuilder<
/code> に変換、追加され、<code>String</code> へ変換されます。 |
| 4045 各々の繰り返しで文字列が再コピーされ、増大すると繰り返しの数で二次コストの原因になる可能性があります。 |
| 4046 </p> |
| 4047 <p> |
| 4048 明示的に、<code>StringBuffer</code> (または J2SE 5.0の <code>StringBuilder</code>) を使うことで
、より良い性能を得られるかもしれません。 |
| 4049 </p> |
| 4050 <p> |
| 4051 たとえば、 |
| 4052 </p> |
| 4053 <blockquote><pre> |
| 4054 // This is bad |
| 4055 String s = ""; |
| 4056 for (int i = 0; i < field.length; ++i) { |
| 4057 s = s + field[i]; |
| 4058 } |
| 4059 |
| 4060 // This is better |
| 4061 StringBuffer buf = new StringBuffer(); |
| 4062 for (int i = 0; i < field.length; ++i) { |
| 4063 buf.append(field[i]); |
| 4064 } |
| 4065 String s = buf.toString(); |
| 4066 </pre></blockquote> |
| 4067 |
| 4068 |
| 4069 <h3><a name="SIC_INNER_SHOULD_BE_STATIC">SIC: static 内部クラスにすべき (SIC_INNER_SHOULD
_BE_STATIC)</a></h3> |
| 4070 |
| 4071 |
| 4072 <p> |
| 4073 このクラスは内部クラスなのにそれを作成したオブジェクトへの埋め込まれた参照を使用していません。 |
| 4074 この参照はより大きなクラスのインスタンスを作成して、必要以上に長い間作成オブジェクトへの参照を存続しておくかもしれません。 |
| 4075 できれば、クラスは static にすべきです。 |
| 4076 </p> |
| 4077 |
| 4078 |
| 4079 <h3><a name="SIC_INNER_SHOULD_BE_STATIC_ANON">SIC: 名前付き static 内部クラスにリファクタリングできる
かもしれない (SIC_INNER_SHOULD_BE_STATIC_ANON)</a></h3> |
| 4080 |
| 4081 |
| 4082 <p> |
| 4083 このクラスは内部クラスなのにそれを作成したオブジェクトへの埋め込まれた参照を使用していません。 |
| 4084 この参照はより大きなクラスのインスタンスを作成して、必要以上に長く作成オブジェクトへの参照を存続しておくかもしれません。 |
| 4085 できれば、クラスは static 内部クラスにすべきです。 |
| 4086 無名内部クラスは static にできないので、名前付き内部クラスにリファクタリングする必要があります。 |
| 4087 </p> |
| 4088 |
| 4089 |
| 4090 <h3><a name="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS">SIC: static 内部クラスにリファクタリングでき
るかもしれない (SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS)</a></h3> |
| 4091 |
| 4092 |
| 4093 <p> |
| 4094 このクラスは内部クラスなのにそれを作成したオブジェクトへの埋め込まれた参照を使用していません。 |
| 4095 この参照はより大きなクラスのインスタンスを作成して、必要以上に長く作成オブジェクトへの参照を存続しておくかもしれません。 |
| 4096 できれば、クラスは static 内部クラスにすべきです。 |
| 4097 外部オブジェクトへの参照が内部クラスのインスタンスを構築する間必要なので内部クラスのコンストラクタに外部インスタンスへの参照を渡すようにリファクタリングする必要
があります。 |
| 4098 </p> |
| 4099 |
| 4100 |
| 4101 <h3><a name="SS_SHOULD_BE_STATIC">SS: 読み出されないフィールド (SS_SHOULD_BE_STATIC)</a></h3
> |
| 4102 |
| 4103 |
| 4104 <p> |
| 4105 このクラスにはコンパイル時に静的な値に初期化されるインスタンス final フィールドがあります。 |
| 4106 static フィールドにすることを検討してください。 |
| 4107 </p> |
| 4108 |
| 4109 |
| 4110 <h3><a name="UM_UNNECESSARY_MATH">UM: 定数値で Math クラスの static メソッドを呼び出しているメソッド (UM
_UNNECESSARY_MATH)</a></h3> |
| 4111 |
| 4112 |
| 4113 <p> |
| 4114 このメソッドは、定数値で <code>java.lang.Math</code> の static メソッドを呼び出しています。 |
| 4115 このメソッドの結果は、静的に確定している可能性があり、より高速で、ときには定数を使用するほうがより正確です。<br> |
| 4116 検出されるメソッドは、以下のとおりです。 |
| 4117 </p> |
| 4118 <table> |
| 4119 <tr> |
| 4120 <th>メソッド</th> <th>パラメータ</th> |
| 4121 </tr> |
| 4122 <tr> |
| 4123 <td>abs</td> <td>-any-</td> |
| 4124 </tr> |
| 4125 <tr> |
| 4126 <td>acos</td> <td>0.0 or 1.0</td> |
| 4127 </tr> |
| 4128 <tr> |
| 4129 <td>asin</td> <td>0.0 or 1.0</td> |
| 4130 </tr> |
| 4131 <tr> |
| 4132 <td>atan</td> <td>0.0 or 1.0</td> |
| 4133 </tr> |
| 4134 <tr> |
| 4135 <td>atan2</td> <td>0.0</td> |
| 4136 </tr> |
| 4137 <tr> |
| 4138 <td>cbrt</td> <td>0.0 or 1.0</td> |
| 4139 </tr> |
| 4140 <tr> |
| 4141 <td>ceil</td> <td>-any-</td> |
| 4142 </tr> |
| 4143 <tr> |
| 4144 <td>cos</td> <td>0.0</td> |
| 4145 </tr> |
| 4146 <tr> |
| 4147 <td>cosh</td> <td>0.0</td> |
| 4148 </tr> |
| 4149 <tr> |
| 4150 <td>exp</td> <td>0.0 or 1.0</td> |
| 4151 </tr> |
| 4152 <tr> |
| 4153 <td>expm1</td> <td>0.0</td> |
| 4154 </tr> |
| 4155 <tr> |
| 4156 <td>floor</td> <td>-any-</td> |
| 4157 </tr> |
| 4158 <tr> |
| 4159 <td>log</td> <td>0.0 or 1.0</td> |
| 4160 </tr> |
| 4161 <tr> |
| 4162 <td>log10</td> <td>0.0 or 1.0</td> |
| 4163 </tr> |
| 4164 <tr> |
| 4165 <td>rint</td> <td>-any-</td> |
| 4166 </tr> |
| 4167 <tr> |
| 4168 <td>round</td> <td>-any-</td> |
| 4169 </tr> |
| 4170 <tr> |
| 4171 <td>sin</td> <td>0.0</td> |
| 4172 </tr> |
| 4173 <tr> |
| 4174 <td>sinh</td> <td>0.0</td> |
| 4175 </tr> |
| 4176 <tr> |
| 4177 <td>sqrt</td> <td>0.0 or 1.0</td> |
| 4178 </tr> |
| 4179 <tr> |
| 4180 <td>tan</td> <td>0.0</td> |
| 4181 </tr> |
| 4182 <tr> |
| 4183 <td>tanh</td> <td>0.0</td> |
| 4184 </tr> |
| 4185 <tr> |
| 4186 <td>toDegrees</td> <td>0.0 or 1.0</td> |
| 4187 </tr> |
| 4188 <tr> |
| 4189 <td>toRadians</td> <td>0.0</td> |
| 4190 </tr> |
| 4191 </table> |
| 4192 |
| 4193 |
| 4194 <h3><a name="UPM_UNCALLED_PRIVATE_METHOD">UPM: private メソッドは決して呼び出されない (UPM_UNCA
LLED_PRIVATE_METHOD)</a></h3> |
| 4195 |
| 4196 |
| 4197 <p> |
| 4198 この private メソッドは、決して呼び出されません。 |
| 4199 メソッドがリフレクションによって呼び出されるかもしれないが、決して使われないなら除去するべきです。 |
| 4200 </p> |
| 4201 |
| 4202 |
| 4203 <h3><a name="URF_UNREAD_FIELD">UrF: 読み出されないフィールド (URF_UNREAD_FIELD)</a></h3> |
| 4204 |
| 4205 |
| 4206 <p> |
| 4207 このフィールドは決して読み出されません。クラスから除去することを検討してください。 |
| 4208 </p> |
| 4209 |
| 4210 |
| 4211 <h3><a name="UUF_UNUSED_FIELD">UuF: 未使用のフィールド (UUF_UNUSED_FIELD)</a></h3> |
| 4212 |
| 4213 |
| 4214 <p> |
| 4215 このフィールドは決して使われません。クラスから除去することを検討してください。 |
| 4216 </p> |
| 4217 |
| 4218 |
| 4219 <h3><a name="WMI_WRONG_MAP_ITERATOR">WMI: entrySet イテレータではなく効率が悪い keySet イテレータを使
用している (WMI_WRONG_MAP_ITERATOR)</a></h3> |
| 4220 |
| 4221 |
| 4222 <p> |
| 4223 このメソッドは、keySet イテレータから取り出されたキーを使用して、マップエントリの値にアクセスしています。 |
| 4224 Map の entrySet イテレータを使用したほうが <code>Map.get(key)</code> ルックアップを回避するのでより効率的です。 |
| 4225 </p> |
| 4226 |
| 4227 |
| 4228 <h3><a name="DMI_CONSTANT_DB_PASSWORD">Dm: ハードコードされた定数データベースパスワード (DMI_CONSTANT_
DB_PASSWORD)</a></h3> |
| 4229 |
| 4230 |
| 4231 <p> |
| 4232 このコードは、ハードコードされた定数パスワードを使用してデータベース接続を作成しています。 |
| 4233 ソースコードかコンパイルされたコードへアクセスできる人なら誰でも簡単にパスワードを知ることができてしまいます。 |
| 4234 </p> |
| 4235 |
| 4236 |
| 4237 <h3><a name="DMI_EMPTY_DB_PASSWORD">Dm: 空のデータベースパスワード (DMI_EMPTY_DB_PASSWORD)</a
></h3> |
| 4238 |
| 4239 |
| 4240 <p> |
| 4241 このコードは、空白または空のパスワードを使用してデータベース接続を作成しています。 |
| 4242 これはデータベースがパスワードによって保護されていないことを示しています。 |
| 4243 </p> |
| 4244 |
| 4245 |
| 4246 <h3><a name="HRS_REQUEST_PARAMETER_TO_COOKIE">HRS: 信頼できない入力から形成された HTTP cookie (
HRS_REQUEST_PARAMETER_TO_COOKIE)</a></h3> |
| 4247 |
| 4248 |
| 4249 <p> |
| 4250 このコードは信頼できない HTTP パラメータを使用して HTTP クッキーを構築しています。 |
| 4251 このクッキーが HTTP レスポンスに追加されるなら、HRS(HTTP レスポンススプリッティング) 脆弱性を可能にします。<br> |
| 4252 詳細は、<a href="http://en.wikipedia.org/wiki/HTTP_response_splitting">http://en.wik
ipedia.org/wiki/HTTP_response_splitting</a> を参照してください。 |
| 4253 </p> |
| 4254 <p> |
| 4255 FindBugs は、HRS の最も露骨で自明なケースだけを探します。 |
| 4256 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。 |
| 4257 HRS を心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。 |
| 4258 </p> |
| 4259 |
| 4260 |
| 4261 <h3><a name="HRS_REQUEST_PARAMETER_TO_HTTP_HEADER">HRS: HTTP レスポンススプリッティング脆弱性 (H
RS_REQUEST_PARAMETER_TO_HTTP_HEADER)</a></h3> |
| 4262 |
| 4263 |
| 4264 <p> |
| 4265 このコードは、HTTP ヘッダに HTTP パラメータを直接書き込んでいます。これは HRS(HTTP レスポンススプリッティング) 脆弱性を可能にします。<b
r> |
| 4266 詳細は、<a href="http://en.wikipedia.org/wiki/HTTP_response_splitting">http://en.wik
ipedia.org/wiki/HTTP_response_splitting</a> を参照してください。 |
| 4267 </p> |
| 4268 <p> |
| 4269 FindBugs は、HRS の最も露骨で自明なケースだけを探します。 |
| 4270 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。 |
| 4271 HRS を心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。 |
| 4272 </p> |
| 4273 |
| 4274 |
| 4275 <h3><a name="PT_ABSOLUTE_PATH_TRAVERSAL">PT: サーブレットの絶対パストラバーサル (PT_ABSOLUTE_PATH
_TRAVERSAL)</a></h3> |
| 4276 |
| 4277 |
| 4278 <p> |
| 4279 ソフトウェアは、制限されたディレクトリ内にあるべきパス名を構築するためにHTTPリクエストのパラメータを使いますが、パラメータはそのディレクトリの外にある場所に
解決できる「/abs/path」のような絶対パスシーケンスを適切に無効にしていません。 |
| 4280 詳細は、<a href="http://cwe.mitre.org/data/definitions/36.html">http://cwe.mitre.org
/data/definitions/36.html</a> を参照してください。 |
| 4281 </p> |
| 4282 <p> |
| 4283 FindBugs は、相対パストラバーサルの最も露骨で自明なケースだけを探します。 |
| 4284 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。 |
| 4285 相対パストラバーサルを心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。 |
| 4286 </p> |
| 4287 |
| 4288 |
| 4289 <h3><a name="PT_RELATIVE_PATH_TRAVERSAL">PT: サーブレットの相対パストラバーサル (PT_RELATIVE_PATH
_TRAVERSAL)</a></h3> |
| 4290 |
| 4291 |
| 4292 <p> |
| 4293 ソフトウェアは、制限されたディレクトリ内にあるべきパス名を構築するためにHTTPリクエストのパラメータを使いますが、パラメータはそのディレクトリの外にある場所に
解決できる「..」のようなシーケンスを適切に無効にしていません。 |
| 4294 詳細は、<a href="http://cwe.mitre.org/data/definitions/23.html">http://cwe.mitre.org
/data/definitions/23.html</a> を参照してください。 |
| 4295 </p> |
| 4296 <p> |
| 4297 FindBugs は、相対パストラバーサルの最も露骨で自明なケースだけを探します。 |
| 4298 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。 |
| 4299 相対パストラバーサルを心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。 |
| 4300 </p> |
| 4301 |
| 4302 |
| 4303 <h3><a name="SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE">SQL: SQL の Statement の e
xecute メソッドに定数でない文字列を渡している (SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE)</a></h3> |
| 4304 |
| 4305 |
| 4306 <p> |
| 4307 このメソッドは、動的に生成されるように思われる文字列で、 SQL の <code>Statement</code> の <code>execute</code>
メソッドを呼び出しています。 |
| 4308 その代わりに <code>PreparedStatement</code> を使うことを検討してください。 |
| 4309 効率的で、SQL インジェクション攻撃に強いです。 |
| 4310 </p> |
| 4311 |
| 4312 |
| 4313 <h3><a name="SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING">SQL: Prep
aredStatement が定数でない文字列から生成されている (SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONST
ANT_STRING)</a></h3> |
| 4314 |
| 4315 |
| 4316 <p> |
| 4317 このコードは、定数でない文字列から SQL の <code>PreparedStatement</code> を作成しています。 |
| 4318 ユーザからのチェックされていない汚染されたデータがこの文字列を作る際に使われるなら、PreparedStatement で予想外で望ましくない何かをするために
SQL インジェクションが使われる可能性があります。 |
| 4319 </p> |
| 4320 |
| 4321 |
| 4322 <h3><a name="XSS_REQUEST_PARAMETER_TO_JSP_WRITER">XSS: 反射型クロスサイトスクリプティング脆弱性がある J
SP (XSS_REQUEST_PARAMETER_TO_JSP_WRITER)</a></h3> |
| 4323 |
| 4324 |
| 4325 <p> |
| 4326 このコードは、JSP の出力に HTTP パラメータを直接書き込んでいます。これは XSS(クロスサイトスクリプティング) 脆弱性を可能にします。<br> |
| 4327 詳細は、<a href="http://en.wikipedia.org/wiki/Cross-site_scripting">http://en.wikipe
dia.org/wiki/Cross-site_scripting</a> を参照してください。 |
| 4328 </p> |
| 4329 <p> |
| 4330 FindBugs は、XSS の最も露骨で自明なケースだけを探します。 |
| 4331 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。 |
| 4332 XSS に関して心配しているなら商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。 |
| 4333 </p> |
| 4334 |
| 4335 |
| 4336 <h3><a name="XSS_REQUEST_PARAMETER_TO_SEND_ERROR">XSS: 反射型クロスサイトスクリプティング脆弱性がエラーペ
ージにあるサーブレット (XSS_REQUEST_PARAMETER_TO_SEND_ERROR)</a></h3> |
| 4337 |
| 4338 |
| 4339 <p> |
| 4340 このコードは、サーブレットのエラーページに <code>HttpServletResponse.sendError</code> を使用して HTTP パラメー
タを直接書き込んでいます。 |
| 4341 信頼できない入力を返すことは反射型 XSS(クロスサイトスクリプティング) 脆弱性を可能にします。<br> |
| 4342 詳細は、<a href="http://en.wikipedia.org/wiki/Cross-site_scripting">http://en.wikipe
dia.org/wiki/Cross-site_scripting</a> を参照してください。 |
| 4343 </p> |
| 4344 <p> |
| 4345 FindBugs は、XSS の最も露骨で自明なケースだけを探します。 |
| 4346 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。 |
| 4347 XSS を心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。 |
| 4348 </p> |
| 4349 |
| 4350 |
| 4351 <h3><a name="XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER">XSS: 反射型クロスサイトスクリプティング脆弱性が
あるサーブレット (XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER)</a></h3> |
| 4352 |
| 4353 |
| 4354 <p> |
| 4355 このコードは、サーブレットの出力に HTTP パラメータを直接書き込んでいます。これは反射型 XSS(クロスサイトスクリプティング) 脆弱性を可能にします。<b
r> |
| 4356 詳細は、<a href="http://en.wikipedia.org/wiki/Cross-site_scripting">http://en.wikipe
dia.org/wiki/Cross-site_scripting</a> を参照してください。 |
| 4357 </p> |
| 4358 <p> |
| 4359 FindBugs は、XSS の最も露骨で自明なケースだけを探します。 |
| 4360 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。 |
| 4361 XSS を心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。 |
| 4362 </p> |
| 4363 |
| 4364 |
| 4365 <h3><a name="BC_BAD_CAST_TO_ABSTRACT_COLLECTION">BC: 抽象コレクションへの疑わしいキャスト (BC_BAD_
CAST_TO_ABSTRACT_COLLECTION)</a></h3> |
| 4366 |
| 4367 |
| 4368 <p> |
| 4369 このコードは、Collection を抽象コレクションにキャストしています (たとえば <code>List</code>、<code>Set</code>、<
code>Map</code>)。 |
| 4370 オブジェクトがキャストする型であると保証されることを確認してください。 |
| 4371 必要とするコレクションの反復処理ができるなら Set または List にキャストする必要はありません。 |
| 4372 </p> |
| 4373 |
| 4374 |
| 4375 <h3><a name="BC_BAD_CAST_TO_CONCRETE_COLLECTION">BC: 具象コレクションへの疑わしいキャスト (BC_BAD_
CAST_TO_CONCRETE_COLLECTION)</a></h3> |
| 4376 |
| 4377 |
| 4378 <p> |
| 4379 このコードは抽象コレクション (たとえば、Collection、List、Set) を特定の具象実装 (たとえば、ArrayList、HashSet) にキャス
トしています。 |
| 4380 これは正しくないかもしれません。そして、将来の時点で他の具象実装への切り替えをとても困難にするので、脆弱なコードになるかもしれません。 |
| 4381 そうするために特別な理由がないかぎり抽象コレクションクラスを使用してください。 |
| 4382 </p> |
| 4383 |
| 4384 |
| 4385 <h3><a name="BC_UNCONFIRMED_CAST">BC: 未チェック/未確認のキャスト (BC_UNCONFIRMED_CAST)</a></
h3> |
| 4386 |
| 4387 |
| 4388 <p> |
| 4389 このキャストはチェックされていません。すべての型のインスタンスがキャストした型にキャストできるというわけではありません。 |
| 4390 プログラムのロジックがこのキャストが失敗しないことを確実に確認してください。 |
| 4391 </p> |
| 4392 |
| 4393 |
| 4394 <h3><a name="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE">BC: メソッドからの戻り値の未チェック/未確認のキャスト
(BC_UNCONFIRMED_CAST_OF_RETURN_VALUE)</a></h3> |
| 4395 |
| 4396 |
| 4397 <p> |
| 4398 このコードは、メソッドの戻り値の未確認のキャストを実行しています。 |
| 4399 コードは、キャストが安全であることが保証されるようにメソッドを呼び出しているかもしれませんが、FindBugs はキャストが安全であることを検証できません。 |
| 4400 プログラムのロジックがこのキャストが失敗しないことを確実に確認してください。 |
| 4401 </p> |
| 4402 |
| 4403 |
| 4404 <h3><a name="BC_VACUOUS_INSTANCEOF">BC: 常に true を返す instanceof (BC_VACUOUS_INSTA
NCEOF)</a></h3> |
| 4405 |
| 4406 |
| 4407 <p> |
| 4408 この instanceof は常に true を返します (テストしている値が null でないかぎり)。 |
| 4409 これは安全で、誤解や論理エラーを指摘していないことを確認してください。 |
| 4410 本当に null なのか値をテストしたいなら、多分、instanceof ではなく null テストをしたほうが良く、より明確になります。 |
| 4411 </p> |
| 4412 |
| 4413 |
| 4414 <h3><a name="ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT">BSHIFT: 符号なし右シフトを short/by
te にキャストしている (ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT)</a></h3> |
| 4415 |
| 4416 |
| 4417 <p> |
| 4418 このコードは、符号なしキャストの実行結果を short または byte にキャストしています。結果の上位ビットは捨てられます。 |
| 4419 上位ビットが捨てられるので、符号付き、符号なし右シフトの (シフトのサイズによって) 違いがないかもしれません。 |
| 4420 </p> |
| 4421 |
| 4422 |
| 4423 <h3><a name="CI_CONFUSED_INHERITANCE">CI: final なクラスが protected フィールドを宣言している (CI
_CONFUSED_INHERITANCE)</a></h3> |
| 4424 |
| 4425 |
| 4426 <p> |
| 4427 このクラスは、final と宣言されていますが、フィールドは protected と宣言されています。 |
| 4428 クラスは fainal なので派生できません。、protected の使用は紛らわしいです。 |
| 4429 フィールドのためのアクセス修飾子は、フィールドの真の用途を表すため、 private か public に変更するべきです。 |
| 4430 </p> |
| 4431 |
| 4432 |
| 4433 <h3><a name="DB_DUPLICATE_BRANCHES">DB: 2つの分岐のために同じコードを使用しているメソッド (DB_DUPLICATE_
BRANCHES)</a></h3> |
| 4434 |
| 4435 |
| 4436 <p> |
| 4437 このメソッドは、条件分岐の2つの分岐を実装するために同じコードを使用しています。これがコーディングミスではないことを確認してください。 |
| 4438 </p> |
| 4439 |
| 4440 |
| 4441 <h3><a name="DB_DUPLICATE_SWITCH_CLAUSES">DB: switch 文の2つの case のために同じコードを使用している
メソッド (DB_DUPLICATE_SWITCH_CLAUSES)</a></h3> |
| 4442 |
| 4443 |
| 4444 <p> |
| 4445 このメソッドは、switch 文の2つの case を実装するために同じコードを使用しています。 |
| 4446 複製コードの case かもしれないしコーディングミスかもしれません。 |
| 4447 </p> |
| 4448 |
| 4449 |
| 4450 <h3><a name="DLS_DEAD_LOCAL_STORE">DLS: ローカル変数への無効な代入 (DLS_DEAD_LOCAL_STORE)</a>
</h3> |
| 4451 |
| 4452 |
| 4453 <p> |
| 4454 この命令はローカル変数に値を代入していますが、値は読み出されないか以降の命令でも使われません。 |
| 4455 多くの場合、計算された値が決して使われないので、これは誤りを示します。 |
| 4456 </p> |
| 4457 <p> |
| 4458 Sun の javac コンパイラが final なローカル変数のためにしばしば無効な格納を生成することに注意してください。 |
| 4459 FindBugs は、バイトコードベースのツールなので誤検出をなくす簡単な方法がありません。 |
| 4460 </p> |
| 4461 |
| 4462 |
| 4463 <h3><a name="DLS_DEAD_LOCAL_STORE_IN_RETURN">DLS: return 文に役に立たない代入がある (DLS_DEAD
_LOCAL_STORE_IN_RETURN)</a></h3> |
| 4464 |
| 4465 |
| 4466 <p> |
| 4467 この文は、return 文でローカル変数に代入をしています。この代入は効果がありません。 |
| 4468 この文が正しいことを確かめてください。 |
| 4469 </p> |
| 4470 |
| 4471 |
| 4472 <h3><a name="DLS_DEAD_LOCAL_STORE_OF_NULL">DLS: ローカル変数への無効な null 代入 (DLS_DEAD_LO
CAL_STORE_OF_NULL)</a></h3> |
| 4473 |
| 4474 |
| 4475 <p> |
| 4476 このコードはローカル変数に null を代入していますが代入された値は読み出されていません。 |
| 4477 この代入はガベージコレクタを手伝うために導入されたのかもしれませんが、Java SE 6 ではもはや必要とされないか有効ではありません。 |
| 4478 </p> |
| 4479 |
| 4480 |
| 4481 <h3><a name="DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD">DLS: フィールドを遮るローカル変数への無効な代入 (DLS
_DEAD_LOCAL_STORE_SHADOWS_FIELD)</a></h3> |
| 4482 |
| 4483 |
| 4484 <p> |
| 4485 この命令は、ローカル変数に値を代入していますが、値は読み出されないか以降の命令でも使われません。 |
| 4486 多くの場合、計算された値が決して使われないので、これは誤りを示します。 |
| 4487 フィールドがローカル変数と同じ名前です。そうではなく、フィールドに代入するつもりでしたか? |
| 4488 </p> |
| 4489 |
| 4490 |
| 4491 <h3><a name="DMI_HARDCODED_ABSOLUTE_FILENAME">DMI: ハードコードされた絶対パス名への参照がある (DMI_HA
RDCODED_ABSOLUTE_FILENAME)</a></h3> |
| 4492 |
| 4493 |
| 4494 <p> |
| 4495 このコードは、ハードコードされた絶対パス名を使用して File オブジェクトを構築しています (たとえば <code>new File("/home/danny
c/workspace/j2ee/src/share/com/sun/enterprise/deployment");</code>)。 |
| 4496 </p> |
| 4497 |
| 4498 |
| 4499 <h3><a name="DMI_NONSERIALIZABLE_OBJECT_WRITTEN">DMI: ObjectOutput に書き込まれる非直列化可能
オブジェクト (DMI_NONSERIALIZABLE_OBJECT_WRITTEN)</a></h3> |
| 4500 |
| 4501 |
| 4502 <p> |
| 4503 このコードは、<code>ObjectOutput.writeObject</code> に非直列化可能オブジェクトを渡していると思われます。 |
| 4504 このオブジェクトが本当に非直列化可能なら、エラーを招きます。 |
| 4505 </p> |
| 4506 |
| 4507 |
| 4508 <h3><a name="DMI_USELESS_SUBSTRING">DMI: substring(0) の呼び出しは元の値を返す (DMI_USELESS_
SUBSTRING)</a></h3> |
| 4509 |
| 4510 |
| 4511 <p> |
| 4512 このコードは、文字列で <code>substring(0)</code> を呼び出していますが、元の値を返します。 |
| 4513 </p> |
| 4514 |
| 4515 |
| 4516 <h3><a name="DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED">Dm: Thread オブジェクトが Runna
ble が期待されているところに渡されている (DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED)</a></h3> |
| 4517 |
| 4518 |
| 4519 <p> |
| 4520 Threadオブジェクトが Runnable が期待されているメソッドへのパラメータとして渡されています。 |
| 4521 これはかなり異常で、論理エラーを示すか、予想外の振る舞いの原因になるかもしれません。 |
| 4522 </p> |
| 4523 |
| 4524 |
| 4525 <h3><a name="EQ_DOESNT_OVERRIDE_EQUALS">Eq: スーパークラスの equals メソッドをオーバーライドしていないクラス
(EQ_DOESNT_OVERRIDE_EQUALS)</a></h3> |
| 4526 |
| 4527 |
| 4528 <p> |
| 4529 このクラスは、<code>equals</code> メソッドを定義しているクラスを拡張してフィールドを追加していますが、<code>equals</code>
メソッドを定義していません。 |
| 4530 したがって、このクラスのインスタンスの等価性は、サブクラスと追加されたフィールドの同一性を無視します。 |
| 4531 これが意図したことで、しかも、<code>equals</code> メソッドをオーバーライドする必要がないことを確実にしてください。 |
| 4532 たとえ <code>equals</code> メソッドをオーバーライドする必要がないとしても、サブクラスのための <code>equals</code> メソ
ッドが <code>super.equals(o)</code> を呼び出して結果を返すという事実を実証するために、いずれにしろ、<code>equals</c
ode> メソッドをオーバーライドすることを検討してください。 |
| 4533 </p> |
| 4534 |
| 4535 |
| 4536 <h3><a name="EQ_UNUSUAL">Eq: 異常な equals メソッド (EQ_UNUSUAL)</a></h3> |
| 4537 |
| 4538 |
| 4539 <p> |
| 4540 このクラスの <code>equals</code> メソッドは、引数の型が <code>this</code> オブジェクトの型と互換性があるこをチェックする
ために、我々が認識しているパターンで何もしていません。 |
| 4541 このコードは何も間違っていないかもしれませんが、レビューする価値があります。 |
| 4542 </p> |
| 4543 |
| 4544 |
| 4545 <h3><a name="FE_FLOATING_POINT_EQUALITY">FE: 浮動小数点の等価性のためのテスト (FE_FLOATING_POINT
_EQUALITY)</a></h3> |
| 4546 |
| 4547 |
| 4548 <p> |
| 4549 この演算は、等価性のために2つの浮動小数点値を比較しています。 |
| 4550 浮動小数点の計算は丸めを伴うかもしれないので計算された float と double の値は正確ではないかもしれません。 |
| 4551 通貨のような正確でなければならない値のために、<code>BigDecimal</code> のような固定精度型を使うことを検討してください。 |
| 4552 正確である必要がない値のためにいくつかの範囲の中で等価性のために比較することを検討してください。 |
| 4553 たとえば、<code>if (Math.abs(x - y) < .0000001)</code>。<br> |
| 4554 詳細は Java 言語仕様4.2.4を参照してください。 |
| 4555 </p> |
| 4556 |
| 4557 |
| 4558 <h3><a name="VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN">FS: Boolean 型でない引数を %b
書式指示子を使用してフォーマットしている (VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN)</a></h3> |
| 4559 |
| 4560 |
| 4561 <p> |
| 4562 Boolean 型でない引数を %b 書式指示子でフォーマットしています。これは例外をスローしません。 |
| 4563 その代わりに、非 null 値では true 、null では false を出力します。 |
| 4564 書式文字列のこの機能は奇妙で意図したことではないかもしれません。 |
| 4565 </p> |
| 4566 |
| 4567 |
| 4568 <h3><a name="IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD">IA: 潜在的な継承された
メソッドなのか外部のメソッドなのかあいまいなメソッドの呼び出し (IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_M
ETHOD)</a></h3> |
| 4569 |
| 4570 |
| 4571 <p> |
| 4572 内部クラスは、継承されたメソッドか外部クラスで定義されたメソッドなのかどちらとも解釈できるメソッドを呼び出しています。 |
| 4573 たとえば、<code>foo(17)</code> を呼び出します。それはスーパークラスと外部のメソッドの両方で定義されています。 |
| 4574 Java のセマンティックスでは、継承したメソッドを呼び出しますが、これは意図したことではないかもしれません。 |
| 4575 </p> |
| 4576 <p> |
| 4577 本当に継承されたメソッドを呼び出すつもりなら super を付けて (例:super.foo(17)) 呼び出してください。 |
| 4578 そうすれば、外部クラスのメソッドではなく継承されたメソッドを呼び出したいことがこのコードを読む人と FindBugs に明確になります。 |
| 4579 </p> |
| 4580 <p> |
| 4581 <code>this.foo(17)</code> を呼び出す場合は、継承されたメソッドが呼び出されます。 |
| 4582 しかしながら、FindBugs はクラスファイルを見るだけなので、<code>this.foo(17)</code> と <code>foo(17)</code
> の呼び出しの違いを見分けることができません。 |
| 4583 潜在的なあいまいな呼び出しについて文句を言うでしょう。 |
| 4584 </p> |
| 4585 |
| 4586 |
| 4587 <h3><a name="IC_INIT_CIRCULARITY">IC: 初期化が循環している (IC_INIT_CIRCULARITY)</a></h3> |
| 4588 |
| 4589 |
| 4590 <p> |
| 4591 バグインスタンスによって参照される2つのクラスのスタティックイニシャライザで循環が検出されました。 |
| 4592 多くの種類の予想外の振る舞いは、そのような循環に起因するかもしれません。 |
| 4593 </p> |
| 4594 |
| 4595 |
| 4596 <h3><a name="ICAST_IDIV_CAST_TO_DOUBLE">ICAST: 整数の除算の結果を double または float にキャストし
ている (ICAST_IDIV_CAST_TO_DOUBLE)</a></h3> |
| 4597 |
| 4598 |
| 4599 <p> |
| 4600 このコードは 整数の除算の結果を double または float にキャストしています。 |
| 4601 整数で除算をすることは、ゼロに最も近い整数値まで結果を切り捨てます。 |
| 4602 結果が double にキャストされたという事実は、この精度が維持されるべきだったことを示唆しています。 |
| 4603 おそらく意味されたことは、除算を実行する前にオペランドの1つまたは両方を double にキャストすることでした。<br> |
| 4604 以下に例を示します。 |
| 4605 </p> |
| 4606 <blockquote><pre> |
| 4607 int x = 2; |
| 4608 int y = 5; |
| 4609 // Wrong: yields result 0.0 |
| 4610 double value1 = x / y; |
| 4611 |
| 4612 // Right: yields result 0.4 |
| 4613 double value2 = x / (double) y; |
| 4614 </pre></blockquote> |
| 4615 |
| 4616 |
| 4617 <h3><a name="ICAST_INTEGER_MULTIPLY_CAST_TO_LONG">ICAST: 整数乗算の結果を long にキャストしている
(ICAST_INTEGER_MULTIPLY_CAST_TO_LONG)</a></h3> |
| 4618 |
| 4619 |
| 4620 <p> |
| 4621 このコードは、以下のように整数の乗算を実行してから結果を long に変換しています。 |
| 4622 </p> |
| 4623 <blockquote><pre> |
| 4624 long convertDaysToMilliseconds(int days) { return 1000*3600*24*days; } |
| 4625 </pre></blockquote> |
| 4626 <p> |
| 4627 long を使用して乗算をすれば、結果がオーバーフローするという可能性を回避できます。<br> |
| 4628 たとえば以下のように修正できます。 |
| 4629 </p> |
| 4630 <blockquote><pre> |
| 4631 long convertDaysToMilliseconds(int days) { return 1000L*3600*24*days; } |
| 4632 </pre></blockquote> |
| 4633 <p> |
| 4634 または |
| 4635 </p> |
| 4636 <blockquote><pre> |
| 4637 static final long MILLISECONDS_PER_DAY = 24L*3600*1000; |
| 4638 long convertDaysToMilliseconds(int days) { return days * MILLISECONDS_PER_DAY; }
|
| 4639 </pre></blockquote> |
| 4640 |
| 4641 |
| 4642 <h3><a name="IM_AVERAGE_COMPUTATION_COULD_OVERFLOW">IM: 平均の計算はオーバーフローする可能性がある (I
M_AVERAGE_COMPUTATION_COULD_OVERFLOW)</a></h3> |
| 4643 |
| 4644 |
| 4645 <p> |
| 4646 このコードは、除算か符号付き右シフトを使用して2つの整数の平均を計算して、結果を配列の添字として使用しています。 |
| 4647 平均値が非常に大きいならオーバーフローする可能性があります (結果として負の平均の計算になる)。 |
| 4648 結果が負でないことを意図していたなら、その代わりに符号なし右シフトを使用できます。 |
| 4649 つまり、<code>(low+high)/2</code> ではなく <code>(low+high) >>> 1</code> を使用してく
ださい。 |
| 4650 </p> |
| 4651 <p> |
| 4652 このバグは、二分探索とマージソートの多くの以前の実装で存在します。 |
| 4653 Martin Buchholz が <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=64
12541">JDK ライブラリでバグを発見し、修正しています</a>。 |
| 4654 Joshua Bloch が <a href="http://googleresearch.blogspot.com/2006/06/extra-extra-r
ead-all-about-it-nearly.html">バグパターンとして公表しました</a>。 |
| 4655 </p> |
| 4656 |
| 4657 |
| 4658 <h3><a name="IM_BAD_CHECK_FOR_ODD">IM: 負数で機能しない奇数チェック (IM_BAD_CHECK_FOR_ODD)</a>
</h3> |
| 4659 |
| 4660 |
| 4661 <p> |
| 4662 このコードは、<code>x % 2 == 1</code> を使用して値が負数なのか確かめていますが、負数 (たとえば、<code>(-5) % 2 == -
1</code>) なので機能しません。 |
| 4663 奇数チェックを意図しているなら、<code>x & 1 == 1</code> または <code>x % 2 != 0</code> を使うことを検討
してください。 |
| 4664 </p> |
| 4665 |
| 4666 |
| 4667 <h3><a name="INT_BAD_REM_BY_1">INT: 1を法とする整数の剰余 (INT_BAD_REM_BY_1)</a></h3> |
| 4668 |
| 4669 |
| 4670 <p> |
| 4671 どんな式 <code>(exp % 1)</code> も常に0を返すことが保証されています。 |
| 4672 そうではなく、<code>(exp & 1)</code> または <code>(exp & 2)</code> を意味していましたか? |
| 4673 </p> |
| 4674 |
| 4675 |
| 4676 <h3><a name="INT_VACUOUS_BIT_OPERATION">INT: 整数値の無意味なビットマスク演算 (INT_VACUOUS_BIT_O
PERATION)</a></h3> |
| 4677 |
| 4678 |
| 4679 <p> |
| 4680 これはどんな有効な働きもしない整数ビット演算 (AND、OR、XOR) です (たとえば <code>v & 0xffffffff</code>)。 |
| 4681 </p> |
| 4682 |
| 4683 |
| 4684 <h3><a name="INT_VACUOUS_COMPARISON">INT: 整数値の無意味な比較 (INT_VACUOUS_COMPARISON)</a
></h3> |
| 4685 |
| 4686 |
| 4687 <p> |
| 4688 常に同じ値を返す整数の比較があります (たとえば <code>x <= Integer.MAX_VALUE</code>)。 |
| 4689 </p> |
| 4690 |
| 4691 |
| 4692 <h3><a name="MTIA_SUSPECT_SERVLET_INSTANCE_FIELD">MTIA: Servlet クラスを拡張したクラスでのインス
タンス変数の使用 (MTIA_SUSPECT_SERVLET_INSTANCE_FIELD)</a></h3> |
| 4693 |
| 4694 |
| 4695 <p> |
| 4696 Servletクラスを拡張したクラスで、インスタンス変数を使用しています。 |
| 4697 Servlet クラスの1つのインスタンスだけが Java EE フレームワークによって作成され、マルチスレッドによって使われるので、このパラダイムは極めて問題
があり、推奨できません。 |
| 4698 ローカル変数を使うことだけを検討してください。 |
| 4699 </p> |
| 4700 |
| 4701 |
| 4702 <h3><a name="MTIA_SUSPECT_STRUTS_INSTANCE_FIELD">MTIA: Struts Action を拡張したクラスでのイ
ンスタンス変数の使用 (MTIA_SUSPECT_STRUTS_INSTANCE_FIELD)</a></h3> |
| 4703 |
| 4704 |
| 4705 <p> |
| 4706 Struts Action クラスを拡張したクラスで、インスタンス変数を使用しています。 |
| 4707 Struts Action クラスの1つのインスタンスだけが Struts フレームワークによって作成され、マルチスレッドによって使われるので、このパラダイムは
極めて問題があり、推奨できません。 |
| 4708 ローカル変数を使うことだけを検討してください。 |
| 4709 モニタを除いて書き込まれるインスタンスフィールドだけが報告されます。 |
| 4710 </p> |
| 4711 |
| 4712 |
| 4713 <h3><a name="NP_DEREFERENCE_OF_READLINE_VALUE">NP: readLine メソッドの結果が null なのか確かめ
ないで値を利用している (NP_DEREFERENCE_OF_READLINE_VALUE)</a></h3> |
| 4714 |
| 4715 |
| 4716 <p> |
| 4717 <code>readLine</code> メソッドの結果が null なのか確かめないで値を利用しています。 |
| 4718 <code>readLine</code> メソッドは、それ以上読み出すテキスト行がなければ null を返すので、NullPointerException が
発生します。 |
| 4719 </p> |
| 4720 |
| 4721 |
| 4722 <h3><a name="NP_IMMEDIATE_DEREFERENCE_OF_READLINE">NP: readLine メソッドの結果をすぐに利用してい
る (NP_IMMEDIATE_DEREFERENCE_OF_READLINE)</a></h3> |
| 4723 |
| 4724 |
| 4725 <p> |
| 4726 <code>readLine</code> メソッドの結果をすぐに利用しています。 |
| 4727 <code>readLine</code> メソッドは、それ以上読み出すテキスト行がなければ null を返すので、NullPointerException が
発生します。 |
| 4728 </p> |
| 4729 |
| 4730 |
| 4731 <h3><a name="NP_LOAD_OF_KNOWN_NULL_VALUE">NP: null とわかっている値のロード (NP_LOAD_OF_KNOW
N_NULL_VALUE)</a></h3> |
| 4732 |
| 4733 |
| 4734 <p> |
| 4735 ここで参照されている変数は、以前に null なのかチェックしているため null であることがわかっています。 |
| 4736 これは有効かもしれないが、間違いかもしれません (多分異なる変数を参照することを意図してました、あるいは以前の null チェックで null でないのか確か
めるべきでした)。 |
| 4737 </p> |
| 4738 |
| 4739 |
| 4740 <h3><a name="NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION">NP: メソッドはパラメータに nullness ア
ノテーションを強化している (NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION)</a></h3> |
| 4741 |
| 4742 |
| 4743 <p> |
| 4744 メソッドは、オーバーライドするメソッドの契約を常に実装するべきです。 |
| 4745 したがって、メソッドが @Nullable としてマークされるパラメーターを取るならば、サブクラスでパラメーターを @Nonnull にしてメソッドをオーバーラ
イドするべきでありません。 |
| 4746 そうするとメソッドが null パラメータを処理すべき契約を破ります。 |
| 4747 </p> |
| 4748 |
| 4749 |
| 4750 <h3><a name="NP_METHOD_RETURN_RELAXING_ANNOTATION">NP: メソッドは戻り値の nullness アノテーショ
ンを緩和している (NP_METHOD_RETURN_RELAXING_ANNOTATION)</a></h3> |
| 4751 |
| 4752 |
| 4753 <p> |
| 4754 メソッドは、オーバーライドするメソッドの契約を常に実装するべきです。 |
| 4755 したがって、メソッドが @Nonnull 値を返すようにアノテートしているならば、サブクラスでメソッドが @Nullable または @CheckForNul
l 値を返すようにアノテートしてメソッドをオーバーライドするべきでありません。 |
| 4756 そうするとメソッドが null を返すべできではない契約を破ります。 |
| 4757 </p> |
| 4758 |
| 4759 |
| 4760 <h3><a name="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE">NP: null になっている可能性があるメソッドの戻
り値を利用している (NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE)</a></h3> |
| 4761 |
| 4762 |
| 4763 <p> |
| 4764 メソッドからの戻り値を null チェックしないで利用しています。メソッドの戻り値は null なのかチェックするべきです。 |
| 4765 コードが実行されると NullPointerException が発生するかもしれません。 |
| 4766 </p> |
| 4767 |
| 4768 |
| 4769 <h3><a name="NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE">NP: null 値を実行不可能かもしれない分岐で
利用している可能性がある (NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE)</a></h3> |
| 4770 |
| 4771 |
| 4772 <p> |
| 4773 分岐または文が実行されるなら、null 値が利用されて NullPointerException が発生します。 |
| 4774 もちろん、問題は分岐または文が実行不可能で、NullPointerException が決して発生する可能性がないということかもしれません。 |
| 4775 それを決めるのは FindBugs の能力を超えています。 |
| 4776 この値がすでに null であることを検査したという事実からこれは明確な可能性です。 |
| 4777 </p> |
| 4778 |
| 4779 |
| 4780 <h3><a name="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE">NP: パラメータは 非
null でなければならないが null 可能としてアノテートされている (NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS
_NULLABLE)</a></h3> |
| 4781 |
| 4782 |
| 4783 <p> |
| 4784 このパラメータは、常に 非 null にすることを要求する方法で使われていますが、パラメータには明示的に null 可能としてアノテートされています。 |
| 4785 パラメータかアノテーションのどちらかの使い方が間違っています。 |
| 4786 </p> |
| 4787 |
| 4788 |
| 4789 <h3><a name="NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD">NP: 書き込まれていない public または pr
otected フィールドの読み出し (NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD)</a></h3> |
| 4790 |
| 4791 |
| 4792 <p> |
| 4793 プログラムは、決して null 値でない値を書き込むと思われない public または protected フィールドの null 値を利用しています。 |
| 4794 フィールドが解析によって見られない機構を通して初期化されないかぎり、この値を利用すると NullPointerException が発生します。 |
| 4795 </p> |
| 4796 |
| 4797 |
| 4798 <h3><a name="NS_DANGEROUS_NON_SHORT_CIRCUIT">NS: 潜在的な非短絡論理の危険な使用 (NS_DANGEROUS_N
ON_SHORT_CIRCUIT)</a></h3> |
| 4799 |
| 4800 |
| 4801 <p> |
| 4802 このコードは、短絡論理 (&& や ||) ではなく非短絡論理 (& や |) を使用していると思われます。 |
| 4803 さらに、左辺値によって右辺を評価したくない (例外のスローや演算が高くつく副作用があるため) と思っているのかもしれません。 |
| 4804 非短絡論理は、左辺の結果がわかっていて推論できるときでも、両側の式が評価されます。 |
| 4805 これは効率が悪く、右辺の評価でエラーが発生するケースを左辺でガードしているなら、結果としてエラーになる可能性があります。 |
| 4806 </p> |
| 4807 <p> |
| 4808 詳細については、<a href="http://java.sun.com/docs/books/jls/third_edition/html/expressio
ns.html#15.22.2">the Java Language Specification</a> を参照してください。 |
| 4809 </p> |
| 4810 |
| 4811 |
| 4812 <h3><a name="NS_NON_SHORT_CIRCUIT">NS: 非短絡論理の疑わしい使用 (NS_NON_SHORT_CIRCUIT)</a></
h3> |
| 4813 |
| 4814 |
| 4815 <p> |
| 4816 このコードは、短絡論理 (&& や ||) ではなく非短絡論理 (& や |) を使用していると思われます。 |
| 4817 非短絡論理は、左辺の結果がわかっていて推論できるときでも、両側の式が評価されます。 |
| 4818 これは効率が悪く、右辺の評価でエラーが発生するケースを左辺でガードしているなら、結果としてエラーになる可能性があります。 |
| 4819 </p> |
| 4820 <p> |
| 4821 詳細については、<a href="http://java.sun.com/docs/books/jls/third_edition/html/expressio
ns.html#15.22.2">the Java Language Specification</a> を参照してください。 |
| 4822 </p> |
| 4823 |
| 4824 |
| 4825 <h3><a name="PZLA_PREFER_ZERO_LENGTH_ARRAYS">PZLA: null ではなく長さが0の配列を返すことを検討する (P
ZLA_PREFER_ZERO_LENGTH_ARRAYS)</a></h3> |
| 4826 |
| 4827 |
| 4828 <p> |
| 4829 結果がないこと (すなわち、結果の空のリスト) を示すために null 参照ではなく長さが0の配列 を返すことは、多くの場合より良い設計です。 |
| 4830 </p> |
| 4831 <p> |
| 4832 他方では、「この質問に対する答えがない」ことを示すために、null を使うことはおそらく適切です。 |
| 4833 たとえば、<code>File.listFiles()</code> は、ファイルがないディレクトリを与えられた場合は空のリストを返し、ファイルがディレクトリで
ないなら null を返します。 |
| 4834 </p> |
| 4835 |
| 4836 |
| 4837 <h3><a name="QF_QUESTIONABLE_FOR_LOOP">QF: 複雑か巧妙か間違ったインクリメントの for ループ (QF_QUESTI
ONABLE_FOR_LOOP)</a></h3> |
| 4838 |
| 4839 |
| 4840 <p> |
| 4841 本当にこの for ループが正しい変数をインクリメントしていますか? |
| 4842 別の変数が for ループによって初期化されてチェックされるように見えます。 |
| 4843 </p> |
| 4844 |
| 4845 |
| 4846 <h3><a name="RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE">RCN: 非 null 値と
null 値との冗長な比較 (RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE)</a></h3> |
| 4847 |
| 4848 |
| 4849 <p> |
| 4850 このメソッドにはnull でないことがわかっている参照と null とわかっている別の参照との比較があります。 |
| 4851 </p> |
| 4852 |
| 4853 |
| 4854 <h3><a name="RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES">RCN: 2つの null 値の冗長な比較 (RC
N_REDUNDANT_COMPARISON_TWO_NULL_VALUES)</a></h3> |
| 4855 |
| 4856 |
| 4857 <p> |
| 4858 このメソッドには両方とも明らかに null とわかっている2つの参照の冗長な比較があります。 |
| 4859 </p> |
| 4860 |
| 4861 |
| 4862 <h3><a name="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE">RCN: null でないことがわかっている値の冗
長な null チェック (RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE)</a></h3> |
| 4863 |
| 4864 |
| 4865 <p> |
| 4866 このメソッドには null でないことがわかっている値の冗長な null チェックがあります。 |
| 4867 </p> |
| 4868 |
| 4869 |
| 4870 <h3><a name="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE">RCN: null とわかっている値の冗長な null
チェック (RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE)</a></h3> |
| 4871 |
| 4872 |
| 4873 <p> |
| 4874 このメソッドにはnull とわかっている値の冗長な null チェックがあります。 |
| 4875 </p> |
| 4876 |
| 4877 |
| 4878 <h3><a name="REC_CATCH_EXCEPTION">REC: 例外がスローされないのに例外をキャッチしている (REC_CATCH_EXCEPT
ION)</a></h3> |
| 4879 |
| 4880 |
| 4881 <p> |
| 4882 このメソッドは、例外オブジェクトをキャッチする try-catch ブロックを使用していますが、例外は try ブロックの中でスローされません。また、実行時例外
は明示的にキャッチされません。 |
| 4883 それぞれの catch ブロックが同一である多くの例外型をキャッチすることの短縮形として <code>try { ... } catch (Exception
e) { something }</code> を使用することが共通のバグパターンです。 |
| 4884 しかし、この構文は誤って実行時例外も同様にキャッチするので、潜在的なバグを隠します。 |
| 4885 </p> |
| 4886 <p> |
| 4887 より良いアプローチは、明示的にキャッチするよりもスローされる特定の例外をスローします。 |
| 4888 あるいは、以下に示すように明示的に RuntimeException をキャッチ、再スローして、非実行時例外をキャッチします。 |
| 4889 </p> |
| 4890 <blockquote><pre> |
| 4891 try { |
| 4892 ... |
| 4893 } catch (RuntimeException e) { |
| 4894 throw e; |
| 4895 } catch (Exception e) { |
| 4896 ... deal with all non-runtime exceptions ... |
| 4897 } |
| 4898 </pre></blockquote> |
| 4899 |
| 4900 |
| 4901 <h3><a name="RI_REDUNDANT_INTERFACES">RI: スーパークラスと同じインタフェースを実装しているクラス (RI_REDUND
ANT_INTERFACES)</a></h3> |
| 4902 |
| 4903 |
| 4904 <p> |
| 4905 このクラスは、スーパークラスによっても実装されるインタフェースを実装することを宣言しています。 |
| 4906 スーパークラスがインタフェースを実装するので、これは冗長です。デフォルトですべてのサブクラスもこのインタフェースを実装します。 |
| 4907 このクラスが作成されてから継承階層が変わったことを指摘するかもしれません。インタフェースの実装の所有権を考慮するべきです。 |
| 4908 </p> |
| 4909 |
| 4910 |
| 4911 <h3><a name="RV_CHECK_FOR_POSITIVE_INDEXOF">RV: String.indexOf の結果が正かどうか確かめている (
RV_CHECK_FOR_POSITIVE_INDEXOF)</a></h3> |
| 4912 |
| 4913 |
| 4914 <p> |
| 4915 このメソッドは <code>String.indexOf</code> を呼び出して結果が正かどうか確かめています。 |
| 4916 結果が負かどうか確かめるほうがずっと典型的です。チェックされる部分文字列が先頭以外の場所で出現するときだけ正になります。 |
| 4917 </p> |
| 4918 |
| 4919 |
| 4920 <h3><a name="RV_DONT_JUST_NULL_CHECK_READLINE">RV: readLine メソッドの結果を null でないのか確
かめた後で捨てている (RV_DONT_JUST_NULL_CHECK_READLINE)</a></h3> |
| 4921 |
| 4922 |
| 4923 <p> |
| 4924 <code>readLine</code> メソッドの戻り値を null でないのか確かめた後で捨てています。 |
| 4925 ほとんどすべての状況で、結果が null でないなら戻り値を使用したいでしょう。 |
| 4926 再び <code>readLine</code> メソッドを呼び出すと異なる行が得られます。 |
| 4927 </p> |
| 4928 |
| 4929 |
| 4930 <h3><a name="RV_REM_OF_HASHCODE">RV: ハッシュコードの剰余は負かもしれない (RV_REM_OF_HASHCODE)</a>
</h3> |
| 4931 |
| 4932 |
| 4933 <p> |
| 4934 このコードは、ハッシュコードを計算して別の値を法とする剰余を計算しています。 |
| 4935 ハッシュコードが負かもしれないので、剰余演算の結果も負かもしれません。 |
| 4936 </p> |
| 4937 <p> |
| 4938 計算結果が負ではないことを確認したいなら、コードを変更する必要があるかもしれません。 |
| 4939 除数が2の累乗であることがわかっているなら、代わりにビット演算を使用できます (すなわち、<code>x.hashCode()%n</code> の代わりに <
code>x.hashCode()&(n-1)</code> を使用してください)。 |
| 4940 これはおそらく、剰余を計算するより高速です。 |
| 4941 除数が2の累乗であるということをわかっていないなら、剰余演算の結果の絶対値を取得してください (すなわち <code>Math.abs(x.hashCode()
%n)</code>)。 |
| 4942 </p> |
| 4943 |
| 4944 |
| 4945 <h3><a name="RV_REM_OF_RANDOM_INT">RV: 符号付き32ビット整数の乱数の剰余 (RV_REM_OF_RANDOM_INT)<
/a></h3> |
| 4946 |
| 4947 |
| 4948 <p> |
| 4949 このコードは符号付き整数の乱数を生成して別の値を法とする剰余を計算しています。 |
| 4950 乱数が負かもしれないので、剰余演算の結果も負かもしれません。これが意図したことであることを確実にしてください。 |
| 4951 その代わりに <code>Random.nextInt(int)</code> の使用を強く検討してください。 |
| 4952 </p> |
| 4953 |
| 4954 |
| 4955 <h3><a name="RV_RETURN_VALUE_IGNORED_INFERRED">RV: メソッドは戻り値を無視しています、これは間違いではないです
か? (RV_RETURN_VALUE_IGNORED_INFERRED)</a></h3> |
| 4956 |
| 4957 |
| 4958 <p> |
| 4959 このコードは、メソッドを呼び出して、戻り値を無視しています。 |
| 4960 戻り値は、メソッドが呼び出される型と同じ型です。そして、我々の解析から戻り値が重要であるかもしれないように見えます (たとえば、<code>String.toL
owerCase()</code> の戻り値を無視するような)。 |
| 4961 </p> |
| 4962 <p> |
| 4963 我々は、戻り値を無視することがメソッド本体の単純な解析から悪い考えかもしれないと推測しています。 |
| 4964 このメソッドの戻り値を無視することが重要であるか許容できるかどうかに関して、FindBugs に指示する @CheckReturnValue アノテーションが使
えます。 |
| 4965 </p> |
| 4966 <p> |
| 4967 戻り値を無視することが間違いではないか決めるために、厳密に調査してください。 |
| 4968 </p> |
| 4969 |
| 4970 |
| 4971 <h3><a name="SA_FIELD_DOUBLE_ASSIGNMENT">SA: フィールドの二重代入 (SA_FIELD_DOUBLE_ASSIGNM
ENT)</a></h3> |
| 4972 |
| 4973 |
| 4974 <p> |
| 4975 このメソッドにはフィールドの二重代入があります。<br> |
| 4976 たとえば以下のようなコードです。 |
| 4977 </p> |
| 4978 <blockquote><pre> |
| 4979 int x,y; |
| 4980 public void foo() { |
| 4981 x = x = 17; |
| 4982 } |
| 4983 </pre></blockquote> |
| 4984 <p> |
| 4985 フィールドに2回代入することは役に立たないので、論理エラーかタイプミスかもしれません。 |
| 4986 </p> |
| 4987 |
| 4988 |
| 4989 <h3><a name="SA_LOCAL_DOUBLE_ASSIGNMENT">SA: ローカル変数の二重代入 (SA_LOCAL_DOUBLE_ASSIGN
MENT)</a></h3> |
| 4990 |
| 4991 |
| 4992 <p> |
| 4993 このメソッドにはローカル変数の二重代入があります。<br> |
| 4994 たとえば以下のようなコードです。 |
| 4995 </p> |
| 4996 <blockquote><pre> |
| 4997 public void foo() { |
| 4998 int x,y; |
| 4999 x = x = 17; |
| 5000 } |
| 5001 </pre></blockquote> |
| 5002 <p> |
| 5003 変数に同じ値を2回代入することは役に立たないので、論理エラーかタイプミスかもしれません。 |
| 5004 </p> |
| 5005 |
| 5006 |
| 5007 <h3><a name="SA_LOCAL_SELF_ASSIGNMENT">SA: ローカル変数の自己代入 (SA_LOCAL_SELF_ASSIGNMENT
)</a></h3> |
| 5008 |
| 5009 |
| 5010 <p> |
| 5011 このメソッドにはローカル変数の自己代入があります。<br> |
| 5012 たとえば以下のようなコードです。 |
| 5013 </p> |
| 5014 <blockquote><pre> |
| 5015 public void foo() { |
| 5016 int x = 3; |
| 5017 x = x; |
| 5018 } |
| 5019 </pre></blockquote> |
| 5020 <p> |
| 5021 そのような代入は役に立たないので、論理エラーかタイプミスかもしれません。 |
| 5022 </p> |
| 5023 |
| 5024 |
| 5025 <h3><a name="SF_SWITCH_FALLTHROUGH">SF: 1つの case が次の case へと通り抜ける switch 文を発見した
(SF_SWITCH_FALLTHROUGH)</a></h3> |
| 5026 |
| 5027 |
| 5028 <p> |
| 5029 このメソッドには1つの case が次の case へと通り抜ける switch 文があります。 |
| 5030 通常、break か return でこの case を終わらせる必要があります。 |
| 5031 </p> |
| 5032 |
| 5033 |
| 5034 <h3><a name="SF_SWITCH_NO_DEFAULT">SF: default がない switch 文を発見した (SF_SWITCH_NO_D
EFAULT)</a></h3> |
| 5035 |
| 5036 |
| 5037 <p> |
| 5038 このメソッドにはdefault がない switch 文があります。 |
| 5039 通常、default を用意する必要があります。 |
| 5040 </p> |
| 5041 <p> |
| 5042 解析は生成されたバイトコードを見るだけなので、default が switch 文の終わりにあって、break 文で終わらないならば、誤警告のトリガーとなりま
す。 |
| 5043 </p> |
| 5044 |
| 5045 |
| 5046 <h3><a name="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD">ST: インスタンスメソッドから static フィ
ールドへの書き込み (ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD)</a></h3> |
| 5047 |
| 5048 |
| 5049 <p> |
| 5050 このインスタンスメソッドは、static フィールドに書き込みをしています。 |
| 5051 複数のインスタンスが操作されているなら、正しくさせるのは難しいです。一般的に間違ったプラクティスです。 |
| 5052 </p> |
| 5053 |
| 5054 |
| 5055 <h3><a name="SE_PRIVATE_READ_RESOLVE_NOT_INHERITED">Se: サブクラスで継承できない private な r
eadResolve メソッド (SE_PRIVATE_READ_RESOLVE_NOT_INHERITED)</a></h3> |
| 5056 |
| 5057 |
| 5058 <p> |
| 5059 このクラスは、private な <code>readResolve</code> メソッドを定義しています。 |
| 5060 そのため、このメソッドはサブクラスで継承できません。 |
| 5061 これが意図したことなら間違っていないかもしれませんが確認するためにレビューするべきです。 |
| 5062 </p> |
| 5063 |
| 5064 |
| 5065 <h3><a name="SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS">Se: Serializable でないクラ
スの transient フィールド (SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS)</a></h3> |
| 5066 |
| 5067 |
| 5068 <p> |
| 5069 フィールドは、transient と宣言していますが、クラスは直列化可能ではないので、まったく効果がありません。 |
| 5070 クラスが transient だったときの名残かもしれません、あるいは直列化機構を誤解しているのかもしれません。 |
| 5071 </p> |
| 5072 |
| 5073 |
| 5074 <h3><a name="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK">TQ: 値は型修飾子を必要
としているが、不明としてマークされている (TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK)</a><
/h3> |
| 5075 |
| 5076 |
| 5077 <p> |
| 5078 値は、常に型修飾子によって示された値であることを必要とする方法で使われています。 |
| 5079 しかし、値はどこでその型修飾子が必要なのかわからないと述べている明示的なアノテーションがあります。 |
| 5080 使い方かアノテーションのどちらかが間違っています。 |
| 5081 </p> |
| 5082 |
| 5083 |
| 5084 <h3><a name="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK">TQ: 値は型修飾子を必要と
しないが、不明としてマークされている (TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK)</a></h3
> |
| 5085 |
| 5086 |
| 5087 <p> |
| 5088 値は、型修飾子によって示された値でないことを必要とする方法で使われています。 |
| 5089 しかし、値はどこでその型修飾子がいるのか禁止されていのるかわからないと述べている明示的なアノテーションがあります。 |
| 5090 使い方かアノテーションのどちらかが間違っています。 |
| 5091 </p> |
| 5092 |
| 5093 |
| 5094 <h3><a name="UCF_USELESS_CONTROL_FLOW">UCF: 役に立たない制御フロー (UCF_USELESS_CONTROL_FLO
W)</a></h3> |
| 5095 |
| 5096 |
| 5097 <p> |
| 5098 このメソッドには分岐するのかどうかに関係なく、制御フローが同じ場所へと続く、役に立たない制御フロー文があります。<br> |
| 5099 たとえば、これは 空の <code>if</code> 文が原因になります。 |
| 5100 </p> |
| 5101 <blockquote><pre> |
| 5102 if (argv.length == 0) { |
| 5103 // TODO: handle this case |
| 5104 } |
| 5105 </pre></blockquote> |
| 5106 |
| 5107 |
| 5108 <h3><a name="UCF_USELESS_CONTROL_FLOW_NEXT_LINE">UCF: 次の行へ続くだけの役に立たない制御フロー (UCF_
USELESS_CONTROL_FLOW_NEXT_LINE)</a></h3> |
| 5109 |
| 5110 |
| 5111 <p> |
| 5112 このメソッドには分岐するのかどうかに関係なく、制御フローが同じか次の行へと続く、役に立たない制御フロー文があります。<br> |
| 5113 多くの場合、不注意に <code>if</code> 文の本体を空文を使用したことが原因になります。 |
| 5114 </p> |
| 5115 <blockquote><pre> |
| 5116 if (argv.length == 1); |
| 5117 System.out.println("Hello, " + argv[0]); |
| 5118 </pre></blockquote> |
| 5119 |
| 5120 |
| 5121 <h3><a name="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD">UrF: 読み出されない public または prote
cted フィールド (URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD)</a></h3> |
| 5122 |
| 5123 |
| 5124 <p> |
| 5125 このフィールドは決して読み出されません。 |
| 5126 フィールドは、public か protected なので、多分、それは解析の一部として見えないクラスで使用されることを意図しています。 |
| 5127 そうでなければ、クラスから除去することを検討してください。 |
| 5128 </p> |
| 5129 |
| 5130 |
| 5131 <h3><a name="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD">UuF: 未使用の public または protecte
d フィールド (UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD)</a></h3> |
| 5132 |
| 5133 |
| 5134 <p> |
| 5135 このフィールドは決して使用されません。 |
| 5136 フィールドは、public か protected なので、多分、それは解析の一部として見えないクラスで使用されることを意図しています。 |
| 5137 そうでなければ、クラスから除去することを検討してください。 |
| 5138 </p> |
| 5139 |
| 5140 |
| 5141 <h3><a name="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR">UwF: コンストラクタで初期化されていないフィー
ルドを null チェックなしで null 値を利用している (UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR)</a></h
3> |
| 5142 |
| 5143 |
| 5144 <p> |
| 5145 このフィールドは、どんなコンストラクタの中でも決して初期化されません。したがって、オブジェクトが構築された後、null である可能性があります。 |
| 5146 どこかほかで、値がロードされて、null チェックなしで null 値が利用されます。 |
| 5147 フィールドが初期化される前に利用されると NullPointerException が発生するので、誤りか疑わしい設計かもしれません。 |
| 5148 </p> |
| 5149 |
| 5150 |
| 5151 <h3><a name="UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD">UwF: 書き込まてれいない public または
protected フィールド (UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD)</a></h3> |
| 5152 |
| 5153 |
| 5154 <p> |
| 5155 この public または protected フィールドは書き込まれていません。このフィールドからの読み出しはデフォルト値を返します。 |
| 5156 誤りをチェックしてください (フィールドは初期化するべきでしたか?)。使わないなら除去してください。 |
| 5157 </p> |
| 5158 |
| 5159 |
| 5160 <h3><a name="XFB_XML_FACTORY_BYPASS">XFB: XMLインタフェースの特定の実装のインスタンスを作成しているメソッド (XF
B_XML_FACTORY_BYPASS)</a></h3> |
| 5161 |
| 5162 |
| 5163 <p> |
| 5164 このメソッドは、XMLインタフェースの特定の実装のインスタンスを作成しています。 |
| 5165 実装が実行時に変更できるように、これらのオブジェクトを作成するために提供されたファクトリクラスを使うことが望ましいです。<br> |
| 5166 詳細は、以下を参照してください。 |
| 5167 </p> |
| 5168 <ul> |
| 5169 <li>javax.xml.parsers.DocumentBuilderFactory</li> |
| 5170 <li>javax.xml.parsers.SAXParserFactory</li> |
| 5171 <li>javax.xml.transform.TransformerFactory</li> |
| 5172 <li>org.w3c.dom.Document.create<i>XXXX</i></li> |
| 5173 </ul> |
| 5174 |
| 5175 |
| 5176 |
| 5177 |
| 5178 <hr> <p> |
| 5179 <script language="JavaScript" type="text/javascript"> |
| 5180 <!---//hide script from old browsers |
| 5181 document.write( "Last updated "+ document.lastModified + "." ); |
| 5182 //end hiding contents ---> |
| 5183 </script> |
| 5184 <p> Send comments to <a class="sidebar" href="mailto:findbugs@cs.umd.edu">findbu
gs@cs.umd.edu</a> |
| 5185 <p> |
| 5186 <A href="http://sourceforge.net"><IMG src="http://sourceforge.net/sflogo.php?gro
up_id=96405&type=5" width="210" height="62" border="0" alt="SourceForge.net
Logo" /></A> |
| 5187 </td></tr></table> |
| 5188 </body></html> |
OLD | NEW |