Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(317)

Side by Side Diff: doc/bugDescriptions_ja.html

Issue 1232833004: Update findbugs from 3.0.0 to 3.0.1. (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/findbugs.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.or g/TR/html4/loose.dtd">
2 <html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
3 <title>FindBugs Bug Descriptions</title>
4 <link rel="stylesheet" type="text/css" href="findbugs.css"/>
5 <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
6 </head><body>
7
8 <table width="100%"><tr>
9
10 <td bgcolor="#b9b9fe" valign="top" align="left" width="20%">
11 <table width="100%" cellspacing="0" border="0">
12 <tr><td><a class="sidebar" href="index.html"><img src="umdFindbugs.png" alt="Fin dBugs"></a></td></tr>
13
14 <tr><td>&nbsp;</td></tr>
15
16 <tr><td><b>Docs and Info</b></td></tr>
17 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="findbugs2.html">FindBugs 2.0</a></font></td></tr>
18 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="demo.html">Demo and data< /a></font></td></tr>
19 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="users.html">Users and sup porters</a></font></td></tr>
20 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="http://findbugs.blogspot. com/">FindBugs blog</a></font></td></tr>
21 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="factSheet.html">Fact shee t</a></font></td></tr>
22 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="manual/index.html">Manual </a></font></td></tr>
23 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="ja/manual/index.html">Man ual(ja/&#26085;&#26412;&#35486;)</a></font></td></tr>
24 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="FAQ.html">FAQ</a></font>< /td></tr>
25 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="bugDescriptions.html">Bug descriptions</a></font></td></tr>
26 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="bugDescriptions_ja.html"> Bug descriptions(ja/&#26085;&#26412;&#35486;)</a></font></td></tr>
27 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="bugDescriptions_fr.html"> Bug descriptions(fr)</a></font></td></tr>
28 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="mailingLists.html">Mailin g lists</a></font></td></tr>
29 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="publications.html">Docume nts and Publications</a></font></td></tr>
30 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="links.html">Links</a></fo nt></td></tr>
31
32 <tr><td>&nbsp;</td></tr>
33
34 <tr><td><a class="sidebar" href="downloads.html"><b>Downloads</b></a></td></tr>
35
36 <tr><td>&nbsp;</td></tr>
37
38 <tr><td><a class="sidebar" href="http://www.cafeshops.com/findbugs"><b>FindBugs Swag</b></a></td></tr>
39
40 <tr><td>&nbsp;</td></tr>
41
42 <tr><td><b>Development</b></td></tr>
43 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="http://sourceforge.net/p/ findbugs/bugs/">Open bugs</a></font></td></tr>
44 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="reportingBugs.html">Repor ting bugs</a></font></td></tr>
45 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="contributing.html">Contri buting</a></font></td></tr>
46 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="team.html">Dev team</a></ font></td></tr>
47 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="api/index.html">API</a> < a class="sidebar" href="api/overview-summary.html">[no frames]</a></font></td></ tr>
48 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="Changes.html">Change log< /a></font></td></tr>
49 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="http://sourceforge.net/pr ojects/findbugs">SF project page</a></font></td></tr>
50 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="http://code.google.com/p/ findbugs/source/browse/">Browse source</a></font></td></tr>
51 <tr><td><font size="-1">&nbsp;<a class="sidebar" href="http://code.google.com/p/ findbugs/source/list">Latest code changes</a></font></td></tr>
52 </table>
53 </td>
54 <td align="left" valign="top">
55 <h1>FindBugs Bug Descriptions</h1>
56 <p>This document lists the standard bug patterns reported by
57 <a href="http://findbugs.sourceforge.net">FindBugs</a> version 3.0.1.</p>
58 <h2>Summary</h2>
59 <table width="100%">
60 <tr bgcolor="#b9b9fe"><th>Description</th><th>Category</th></tr>
61 <tr bgcolor="#eeeeee"><td><a href="#BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS ">BC: equals メソッドは引数の型を仮定するべきではない</a></td><td>Bad practice</td></tr>
62 <tr bgcolor="#ffffff"><td><a href="#BIT_SIGNED_CHECK">BIT: ビット演算の符号をチェックする</a></ td><td>Bad practice</td></tr>
63 <tr bgcolor="#eeeeee"><td><a href="#CN_IDIOM">CN: Cloneable を実装したクラスが clone メソッド を定義していないか、使用していない</a></td><td>Bad practice</td></tr>
64 <tr bgcolor="#ffffff"><td><a href="#CN_IDIOM_NO_SUPER_CALL">CN: clone メソッドが supe r.clone() を呼び出していない</a></td><td>Bad practice</td></tr>
65 <tr bgcolor="#eeeeee"><td><a href="#CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE">CN: C loneable を実装していないクラスが clone メソッドを定義している</a></td><td>Bad practice</td></tr>
66 <tr bgcolor="#ffffff"><td><a href="#CNT_ROUGH_CONSTANT_VALUE">CNT: 既知の定数の雑な値を見つけ る</a></td><td>Bad practice</td></tr>
67 <tr bgcolor="#eeeeee"><td><a href="#CO_ABSTRACT_SELF">Co: 抽象クラスは共変な compareTo メソ ッドを定義している</a></td><td>Bad practice</td></tr>
68 <tr bgcolor="#ffffff"><td><a href="#CO_COMPARETO_INCORRECT_FLOATING">Co: compare To()/compare() は間違って float または double 値を処理する</a></td><td>Bad practice</td></tr>
69 <tr bgcolor="#eeeeee"><td><a href="#CO_COMPARETO_RESULTS_MIN_VALUE">Co: compareT o()/compare() は Integer.MIN_VALUE を返す</a></td><td>Bad practice</td></tr>
70 <tr bgcolor="#ffffff"><td><a href="#CO_SELF_NO_OBJECT">Co: 共変な compareTo メソッドの定義 </a></td><td>Bad practice</td></tr>
71 <tr bgcolor="#eeeeee"><td><a href="#DE_MIGHT_DROP">DE: 例外を捨てているかもしれないメソッド</a></t d><td>Bad practice</td></tr>
72 <tr bgcolor="#ffffff"><td><a href="#DE_MIGHT_IGNORE">DE: 例外を無視しているかもしれないメソッド</a> </td><td>Bad practice</td></tr>
73 <tr bgcolor="#eeeeee"><td><a href="#DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS">DMI: エントリセットの要素を加えることは、Entry オブジェクトの再利用のために失敗するかもしれない</a></td><td>Bad practice</td>< /tr>
74 <tr bgcolor="#ffffff"><td><a href="#DMI_RANDOM_USED_ONLY_ONCE">DMI: Random オブジェク トが作成され1度しか使われない</a></td><td>Bad practice</td></tr>
75 <tr bgcolor="#eeeeee"><td><a href="#DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION">DMI : コレクションを消去するために removeAll メソッドを使用しない</a></td><td>Bad practice</td></tr>
76 <tr bgcolor="#ffffff"><td><a href="#DM_EXIT">Dm: System.exit(...) を呼び出しているメソッド</ a></td><td>Bad practice</td></tr>
77 <tr bgcolor="#eeeeee"><td><a href="#DM_RUN_FINALIZERS_ON_EXIT">Dm: 危険なメソッド runFi nalizersOnExit を呼び出しているメソッド</a></td><td>Bad practice</td></tr>
78 <tr bgcolor="#ffffff"><td><a href="#ES_COMPARING_PARAMETER_STRING_WITH_EQ">ES: S tring パラメータを == や != を使用して比較している</a></td><td>Bad practice</td></tr>
79 <tr bgcolor="#eeeeee"><td><a href="#ES_COMPARING_STRINGS_WITH_EQ">ES: String オブジ ェクトを == や != を使用して比較している</a></td><td>Bad practice</td></tr>
80 <tr bgcolor="#ffffff"><td><a href="#EQ_ABSTRACT_SELF">Eq: 抽象クラスは共変な equals メソッドを 宣言している</a></td><td>Bad practice</td></tr>
81 <tr bgcolor="#eeeeee"><td><a href="#EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THI S">Eq: equals メソッドは互換性のないオペランドをチェックしている</a></td><td>Bad practice</td></tr>
82 <tr bgcolor="#ffffff"><td><a href="#EQ_COMPARETO_USE_OBJECT_EQUALS">Eq: compareT o(...) メソッドを定義して Object.equals() を使用しているクラス</a></td><td>Bad practice</td></tr>
83 <tr bgcolor="#eeeeee"><td><a href="#EQ_GETCLASS_AND_CLASS_CONSTANT">Eq: equals メ ソッドはサブタイプのために失敗する</a></td><td>Bad practice</td></tr>
84 <tr bgcolor="#ffffff"><td><a href="#EQ_SELF_NO_OBJECT">Eq: 共変な equals メソッドの定義</a ></td><td>Bad practice</td></tr>
85 <tr bgcolor="#eeeeee"><td><a href="#FI_EMPTY">FI: 空のファイナライザは削除するべき</a></td><td>B ad practice</td></tr>
86 <tr bgcolor="#ffffff"><td><a href="#FI_EXPLICIT_INVOCATION">FI: ファイナライザの明示的な呼び出し </a></td><td>Bad practice</td></tr>
87 <tr bgcolor="#eeeeee"><td><a href="#FI_FINALIZER_NULLS_FIELDS">FI: ファイナライザはフィールド を null にする</a></td><td>Bad practice</td></tr>
88 <tr bgcolor="#ffffff"><td><a href="#FI_FINALIZER_ONLY_NULLS_FIELDS">FI: ファイナライザは フィールドを null にするだけ</a></td><td>Bad practice</td></tr>
89 <tr bgcolor="#eeeeee"><td><a href="#FI_MISSING_SUPER_CALL">FI: ファイナライザはスーパークラスのフ ァイナライザを呼び出していない</a></td><td>Bad practice</td></tr>
90 <tr bgcolor="#ffffff"><td><a href="#FI_NULLIFY_SUPER">FI: ファイナライザはスーパークラスのファイナライ ザを無効にしている</a></td><td>Bad practice</td></tr>
91 <tr bgcolor="#eeeeee"><td><a href="#FI_USELESS">FI: ファイナライザはスーパークラスのファイナライザを呼び出し ているだけ</a></td><td>Bad practice</td></tr>
92 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_USES_NEWLINE">FS: 書式文字列は \n よりも %n を使用するべき</a></td><td>Bad practice</td></tr>
93 <tr bgcolor="#eeeeee"><td><a href="#GC_UNCHECKED_TYPE_IN_GENERIC_CALL">GC: 検査されな い型への総称呼び出し</a></td><td>Bad practice</td></tr>
94 <tr bgcolor="#ffffff"><td><a href="#HE_EQUALS_NO_HASHCODE">HE: equals メソッドは定義してい ますが hashCode メソッドは定義していないクラス</a></td><td>Bad practice</td></tr>
95 <tr bgcolor="#eeeeee"><td><a href="#HE_EQUALS_USE_HASHCODE">HE: equals メソッドを定義して Object.hashCode() を使用しているクラス</a></td><td>Bad practice</td></tr>
96 <tr bgcolor="#ffffff"><td><a href="#HE_HASHCODE_NO_EQUALS">HE: hashCode メソッドを定義し ていますが equals メソッドは定義していないクラス</a></td><td>Bad practice</td></tr>
97 <tr bgcolor="#eeeeee"><td><a href="#HE_HASHCODE_USE_OBJECT_EQUALS">HE: hashCode メソッドを定義して Object.equals() を使用しているクラス</a></td><td>Bad practice</td></tr>
98 <tr bgcolor="#ffffff"><td><a href="#HE_INHERITS_EQUALS_USE_HASHCODE">HE: equals メソッドを継承して Object.hashCode() を使用しているクラス</a></td><td>Bad practice</td></tr>
99 <tr bgcolor="#eeeeee"><td><a href="#IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZ ATION">IC: スーパークラスは初期化中にサブクラスを使用している</a></td><td>Bad practice</td></tr>
100 <tr bgcolor="#ffffff"><td><a href="#IMSE_DONT_CATCH_IMSE">IMSE: 疑わしい IllegalMoni torStateException のキャッチ</a></td><td>Bad practice</td></tr>
101 <tr bgcolor="#eeeeee"><td><a href="#ISC_INSTANTIATE_STATIC_CLASS">ISC: static メソ ッドだけを提供するクラスの不必要なインスタンス化</a></td><td>Bad practice</td></tr>
102 <tr bgcolor="#ffffff"><td><a href="#IT_NO_SUCH_ELEMENT">It: Iterator.next() が No SuchElementException をスローできない</a></td><td>Bad practice</td></tr>
103 <tr bgcolor="#eeeeee"><td><a href="#J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_S ESSION">J2EE: HttpSession への非直列化可能オブジェクトの格納</a></td><td>Bad practice</td></tr>
104 <tr bgcolor="#ffffff"><td><a href="#JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS">JC IP: 不変クラスのフィールドは final にすべき</a></td><td>Bad practice</td></tr>
105 <tr bgcolor="#eeeeee"><td><a href="#ME_ENUM_FIELD_SETTER">ME: public 列挙型メソッドが無条件 にフィールドを設定するPublic enum method unconditionally sets its field</a></td><td>Bad pra ctice</td></tr>
106 <tr bgcolor="#ffffff"><td><a href="#ME_MUTABLE_ENUM_FIELD">ME: 列挙型フィールドは public で可変である</a></td><td>Bad practice</td></tr>
107 <tr bgcolor="#eeeeee"><td><a href="#NP_BOOLEAN_RETURN_NULL">NP: 戻り型が Boolean のメソ ッドが明示的に null を返している</a></td><td>Bad practice</td></tr>
108 <tr bgcolor="#ffffff"><td><a href="#NP_CLONE_COULD_RETURN_NULL">NP: null を返すかもしれ ない clone メソッド</a></td><td>Bad practice</td></tr>
109 <tr bgcolor="#eeeeee"><td><a href="#NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT">NP: e quals メソッドは null の引数をチェックしていない</a></td><td>Bad practice</td></tr>
110 <tr bgcolor="#ffffff"><td><a href="#NP_TOSTRING_COULD_RETURN_NULL">NP: null を返すか もしれない toString メソッド</a></td><td>Bad practice</td></tr>
111 <tr bgcolor="#eeeeee"><td><a href="#NM_CLASS_NAMING_CONVENTION">Nm: クラス名は大文字から始め るべき</a></td><td>Bad practice</td></tr>
112 <tr bgcolor="#ffffff"><td><a href="#NM_CLASS_NOT_EXCEPTION">Nm: 例外クラスのように命名されている が、クラスは Exception から派生されていない</a></td><td>Bad practice</td></tr>
113 <tr bgcolor="#eeeeee"><td><a href="#NM_CONFUSING">Nm: 紛らわしい名前のメソッド</a></td><td>B ad practice</td></tr>
114 <tr bgcolor="#ffffff"><td><a href="#NM_FIELD_NAMING_CONVENTION">Nm: フィールド名は小文字から 始めるべき</a></td><td>Bad practice</td></tr>
115 <tr bgcolor="#eeeeee"><td><a href="#NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER">Nm: Ja va の後のバージョンのキーワードである識別子を使用している</a></td><td>Bad practice</td></tr>
116 <tr bgcolor="#ffffff"><td><a href="#NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER" >Nm: Java の後のバージョンのキーワードである識別子を使用している</a></td><td>Bad practice</td></tr>
117 <tr bgcolor="#eeeeee"><td><a href="#NM_METHOD_NAMING_CONVENTION">Nm: メソッド名は小文字から 始めるべきです</a></td><td>Bad practice</td></tr>
118 <tr bgcolor="#ffffff"><td><a href="#NM_SAME_SIMPLE_NAME_AS_INTERFACE">Nm: クラス名は実 装されたインタフェースの単純名を遮るべきではない</a></td><td>Bad practice</td></tr>
119 <tr bgcolor="#eeeeee"><td><a href="#NM_SAME_SIMPLE_NAME_AS_SUPERCLASS">Nm: クラス名は スーパークラスの単純名を遮るべきではない</a></td><td>Bad practice</td></tr>
120 <tr bgcolor="#ffffff"><td><a href="#NM_VERY_CONFUSING_INTENTIONAL">Nm: 非常に紛らわしい名 前のメソッド (多分意図的)</a></td><td>Bad practice</td></tr>
121 <tr bgcolor="#eeeeee"><td><a href="#NM_WRONG_PACKAGE_INTENTIONAL">Nm: パラメータの間違った パッケージのためにスーパークラスのメソッドをオーバーライドしていないメソッド</a></td><td>Bad practice</td></tr>
122 <tr bgcolor="#ffffff"><td><a href="#ODR_OPEN_DATABASE_RESOURCE">ODR: データベースリソースの クローズに失敗するかもしれないメソッド</a></td><td>Bad practice</td></tr>
123 <tr bgcolor="#eeeeee"><td><a href="#ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH">O DR: 例外経路でデータベースリソースのクローズに失敗するかもしれないメソッド</a></td><td>Bad practice</td></tr>
124 <tr bgcolor="#ffffff"><td><a href="#OS_OPEN_STREAM">OS: ストリームのクローズに失敗するかもしれないメソッ ド</a></td><td>Bad practice</td></tr>
125 <tr bgcolor="#eeeeee"><td><a href="#OS_OPEN_STREAM_EXCEPTION_PATH">OS: 例外経路でストリー ムのクローズに失敗するかもしれないメソッド</a></td><td>Bad practice</td></tr>
126 <tr bgcolor="#ffffff"><td><a href="#PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS">PZ : 繰り返しでエントリオブジェクトを再利用しない</a></td><td>Bad practice</td></tr>
127 <tr bgcolor="#eeeeee"><td><a href="#RC_REF_COMPARISON_BAD_PRACTICE">RC: 定数への疑わしい 参照比較</a></td><td>Bad practice</td></tr>
128 <tr bgcolor="#ffffff"><td><a href="#RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN">RC: Boolean 値の疑わしい参照比較</a></td><td>Bad practice</td></tr>
129 <tr bgcolor="#eeeeee"><td><a href="#RR_NOT_CHECKED">RR: InputStream.read() の戻り値を 無視しているメソッド</a></td><td>Bad practice</td></tr>
130 <tr bgcolor="#ffffff"><td><a href="#SR_NOT_CHECKED">RR: InputStream.skip() の戻り値を 無視しているメソッド</a></td><td>Bad practice</td></tr>
131 <tr bgcolor="#eeeeee"><td><a href="#RV_NEGATING_RESULT_OF_COMPARETO">RV: compare To()/compare() の結果を無効にする</a></td><td>Bad practice</td></tr>
132 <tr bgcolor="#ffffff"><td><a href="#RV_RETURN_VALUE_IGNORED_BAD_PRACTICE">RV: 例外 的戻り値を無視しているメソッド</a></td><td>Bad practice</td></tr>
133 <tr bgcolor="#eeeeee"><td><a href="#SI_INSTANCE_BEFORE_FINALS_ASSIGNED">SI: スタティ ックイニシャライザは、すべての static final フィールドが代入される前にインスタンスを作成する</a></td><td>Bad practice</ td></tr>
134 <tr bgcolor="#ffffff"><td><a href="#SW_SWING_METHODS_INVOKED_IN_SWING_THREAD">SW : Swing メソッドは AWT イベントディスパッチスレッドから呼び出す必要がある</a></td><td>Bad practice</td></tr>
135 <tr bgcolor="#eeeeee"><td><a href="#SE_BAD_FIELD">Se: 直列化可能クラスの非 transient で非直列化 可能なインスタンスフィールド</a></td><td>Bad practice</td></tr>
136 <tr bgcolor="#ffffff"><td><a href="#SE_BAD_FIELD_INNER_CLASS">Se: 非直列化可能クラスに直列化可 能な内部クラスがある</a></td><td>Bad practice</td></tr>
137 <tr bgcolor="#eeeeee"><td><a href="#SE_BAD_FIELD_STORE">Se: 非直列化可能な値を直列化可能クラスのイン スタンスフィールドに格納している</a></td><td>Bad practice</td></tr>
138 <tr bgcolor="#ffffff"><td><a href="#SE_COMPARATOR_SHOULD_BE_SERIALIZABLE">Se: Co mparator は Serializable を実装していない</a></td><td>Bad practice</td></tr>
139 <tr bgcolor="#eeeeee"><td><a href="#SE_INNER_CLASS">Se: 直列化可能な内部クラス</a></td><td> Bad practice</td></tr>
140 <tr bgcolor="#ffffff"><td><a href="#SE_NONFINAL_SERIALVERSIONID">Se: serialVersi onUID が final ではない</a></td><td>Bad practice</td></tr>
141 <tr bgcolor="#eeeeee"><td><a href="#SE_NONLONG_SERIALVERSIONID">Se: serialVersio nUID が long ではない</a></td><td>Bad practice</td></tr>
142 <tr bgcolor="#ffffff"><td><a href="#SE_NONSTATIC_SERIALVERSIONID">Se: serialVers ionUID が static ではない</a></td><td>Bad practice</td></tr>
143 <tr bgcolor="#eeeeee"><td><a href="#SE_NO_SUITABLE_CONSTRUCTOR">Se: Serializable なクラスのスーパークラスで、引数なしコンストラクタを定義していない</a></td><td>Bad practice</td></tr>
144 <tr bgcolor="#ffffff"><td><a href="#SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATI ON">Se: Externalizable なクラスが引数なしコンストラクタを定義していない</a></td><td>Bad practice</td></t r>
145 <tr bgcolor="#eeeeee"><td><a href="#SE_READ_RESOLVE_MUST_RETURN_OBJECT">Se: read Resolve メソッドの戻り値の型が Object で宣言されていない</a></td><td>Bad practice</td></tr>
146 <tr bgcolor="#ffffff"><td><a href="#SE_TRANSIENT_FIELD_NOT_RESTORED">Se: 直列化復元によ って設定されない transient フィールド </a></td><td>Bad practice</td></tr>
147 <tr bgcolor="#eeeeee"><td><a href="#SE_NO_SERIALVERSIONID">SnVI: Serializable なク ラスが serialVersionUID を定義していない</a></td><td>Bad practice</td></tr>
148 <tr bgcolor="#ffffff"><td><a href="#UI_INHERITANCE_UNSAFE_GETRESOURCE">UI: クラスが拡 張されるなら getResource の使い方は安全ではないかもしれない</a></td><td>Bad practice</td></tr>
149 <tr bgcolor="#eeeeee"><td><a href="#BC_IMPOSSIBLE_CAST">BC: 不可能なキャスト</a></td><td >Correctness</td></tr>
150 <tr bgcolor="#ffffff"><td><a href="#BC_IMPOSSIBLE_DOWNCAST">BC: 不可能なダウンキャスト</a>< /td><td>Correctness</td></tr>
151 <tr bgcolor="#eeeeee"><td><a href="#BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY">BC: toArr ay メソッドの結果の不可能なダウンキャスト</a></td><td>Correctness</td></tr>
152 <tr bgcolor="#ffffff"><td><a href="#BC_IMPOSSIBLE_INSTANCEOF">BC: 常に false を返す i nstanceof</a></td><td>Correctness</td></tr>
153 <tr bgcolor="#eeeeee"><td><a href="#BIT_ADD_OF_SIGNED_BYTE">BIT: 符号付きバイト値のビット加算< /a></td><td>Correctness</td></tr>
154 <tr bgcolor="#ffffff"><td><a href="#BIT_AND">BIT: 互換性のないビットマスク</a></td><td>Corre ctness</td></tr>
155 <tr bgcolor="#eeeeee"><td><a href="#BIT_AND_ZZ">BIT: ((...) & 0) == 0 なのか確かめている< /a></td><td>Correctness</td></tr>
156 <tr bgcolor="#ffffff"><td><a href="#BIT_IOR">BIT: 互換性のないビットマスク</a></td><td>Corre ctness</td></tr>
157 <tr bgcolor="#eeeeee"><td><a href="#BIT_IOR_OF_SIGNED_BYTE">BIT: 符号付きバイト値のビット論理和 </a></td><td>Correctness</td></tr>
158 <tr bgcolor="#ffffff"><td><a href="#BIT_SIGNED_CHECK_HIGH_BIT">BIT: ビット演算の符号をチェッ クする</a></td><td>Correctness</td></tr>
159 <tr bgcolor="#eeeeee"><td><a href="#BOA_BADLY_OVERRIDDEN_ADAPTER">BOA: スーパークラスの Adapter で実装されるメソッドを誤ってオーバーライドしているクラス</a></td><td>Correctness</td></tr>
160 <tr bgcolor="#ffffff"><td><a href="#BSHIFT_WRONG_ADD_PRIORITY">BSHIFT: シフト演算の正しく ない構文解析の可能性がある</a></td><td>Correctness</td></tr>
161 <tr bgcolor="#eeeeee"><td><a href="#ICAST_BAD_SHIFT_AMOUNT">BSHIFT: 32ビット int の- 31から31の範囲を超えた量によるシフト</a></td><td>Correctness</td></tr>
162 <tr bgcolor="#ffffff"><td><a href="#DLS_DEAD_LOCAL_INCREMENT_IN_RETURN">DLS: ret urn 文に無駄なインクリメントがある</a></td><td>Correctness</td></tr>
163 <tr bgcolor="#eeeeee"><td><a href="#DLS_DEAD_STORE_OF_CLASS_LITERAL">DLS: クラスリテラ ルの無効な代入</a></td><td>Correctness</td></tr>
164 <tr bgcolor="#ffffff"><td><a href="#DLS_OVERWRITTEN_INCREMENT">DLS: 上書きされたインクリメン ト</a></td><td>Correctness</td></tr>
165 <tr bgcolor="#eeeeee"><td><a href="#DMI_ARGUMENTS_WRONG_ORDER">DMI: 逆にされた引数</a>< /td><td>Correctness</td></tr>
166 <tr bgcolor="#ffffff"><td><a href="#DMI_BAD_MONTH">DMI: 月のための間違った定数値</a></td><td >Correctness</td></tr>
167 <tr bgcolor="#eeeeee"><td><a href="#DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE">DMI: 正確に表されない double から構築された BigDecimal</a></td><td>Correctness</td></tr>
168 <tr bgcolor="#ffffff"><td><a href="#DMI_CALLING_NEXT_FROM_HASNEXT">DMI: hasNext メソッドで next メソッドを呼び出している</a></td><td>Correctness</td></tr>
169 <tr bgcolor="#eeeeee"><td><a href="#DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVE S">DMI: コレクションは自分自身を含めるべきではない</a></td><td>Correctness</td></tr>
170 <tr bgcolor="#ffffff"><td><a href="#DMI_DOH">DMI: D'oh! 無意味なメソッド呼び出し</a></td><td >Correctness</td></tr>
171 <tr bgcolor="#eeeeee"><td><a href="#DMI_INVOKING_HASHCODE_ON_ARRAY">DMI: 配列で has hCode メソッドを呼び出している</a></td><td>Correctness</td></tr>
172 <tr bgcolor="#ffffff"><td><a href="#DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT">DMI: int に対して Double.longBitsToDouble() を呼び出している</a></td><td>Correctness</td></tr>
173 <tr bgcolor="#eeeeee"><td><a href="#DMI_VACUOUS_SELF_COLLECTION_CALL">DMI: コレクショ ンへの無意味な呼び出し</a></td><td>Correctness</td></tr>
174 <tr bgcolor="#ffffff"><td><a href="#DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION" >Dm: ランタイムリテンションなしで、アノテーションの存在を調べるためにリフレクションを使用することはできない</a></td><td>Correctness </td></tr>
175 <tr bgcolor="#eeeeee"><td><a href="#DMI_FUTILE_ATTEMPT_TO_CHANGE_MAXPOOL_SIZE_OF _SCHEDULED_THREAD_POOL_EXECUTOR">Dm: ScheduledThreadPoolExecutor の最大プールサイズを変えようと する無駄な試み</a></td><td>Correctness</td></tr>
176 <tr bgcolor="#ffffff"><td><a href="#DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH_ZERO _CORE_THREADS">Dm: コアプールサイズが0の ScheduledThreadPoolExecutor の作成</a></td><td>Corre ctness</td></tr>
177 <tr bgcolor="#eeeeee"><td><a href="#DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD">Dm: Eas yMock メソッドへの役に立たない/無意味な呼び出し</a></td><td>Correctness</td></tr>
178 <tr bgcolor="#ffffff"><td><a href="#DM_INVALID_MIN_MAX">Dm: Math.max と Math.min の間違った組み合わせ</a></td><td>Correctness</td></tr>
179 <tr bgcolor="#eeeeee"><td><a href="#EC_ARRAY_AND_NONARRAY">EC: equals メソッドを使用して配 列と非配列を比較している</a></td><td>Correctness</td></tr>
180 <tr bgcolor="#ffffff"><td><a href="#EC_BAD_ARRAY_COMPARE">EC: 配列の equals メソッド呼び出 しは == と等価である</a></td><td>Correctness</td></tr>
181 <tr bgcolor="#eeeeee"><td><a href="#EC_INCOMPATIBLE_ARRAY_COMPARE">EC: equals(.. .) メソッドを使用して互換性のない配列を比較している</a></td><td>Correctness</td></tr>
182 <tr bgcolor="#ffffff"><td><a href="#EC_NULL_ARG">EC: equals(null) の呼び出し</a></td> <td>Correctness</td></tr>
183 <tr bgcolor="#eeeeee"><td><a href="#EC_UNRELATED_CLASS_AND_INTERFACE">EC: equals メソッドを呼び出して無関係のクラスとインタフェースを比較している</a></td><td>Correctness</td></tr>
184 <tr bgcolor="#ffffff"><td><a href="#EC_UNRELATED_INTERFACES">EC: equals メソッドを呼び出 して異なる型のインタフェースを比較している</a></td><td>Correctness</td></tr>
185 <tr bgcolor="#eeeeee"><td><a href="#EC_UNRELATED_TYPES">EC: equals メソッドを呼び出して異なる 型を比較している</a></td><td>Correctness</td></tr>
186 <tr bgcolor="#ffffff"><td><a href="#EC_UNRELATED_TYPES_USING_POINTER_EQUALITY">E C: 参照等価性を使用して異なる型を比較している</a></td><td>Correctness</td></tr>
187 <tr bgcolor="#eeeeee"><td><a href="#EQ_ALWAYS_FALSE">Eq: equals メソッドは常に false を戻 す</a></td><td>Correctness</td></tr>
188 <tr bgcolor="#ffffff"><td><a href="#EQ_ALWAYS_TRUE">Eq: equals メソッドは常に true を返す< /a></td><td>Correctness</td></tr>
189 <tr bgcolor="#eeeeee"><td><a href="#EQ_COMPARING_CLASS_NAMES">Eq: equals メソッドはクラ スオブジェクトではなくクラス名を比較している</a></td><td>Correctness</td></tr>
190 <tr bgcolor="#ffffff"><td><a href="#EQ_DONT_DEFINE_EQUALS_FOR_ENUM">Eq: 列挙型は共変な equals メソッドを定義している</a></td><td>Correctness</td></tr>
191 <tr bgcolor="#eeeeee"><td><a href="#EQ_OTHER_NO_OBJECT">Eq: equals(Object) メソッドを オーバーライドしていない equals メソッドの定義</a></td><td>Correctness</td></tr>
192 <tr bgcolor="#ffffff"><td><a href="#EQ_OTHER_USE_OBJECT">Eq: Object.equals(Objec t) をオーバーライドしていない equals メソッドの定義</a></td><td>Correctness</td></tr>
193 <tr bgcolor="#eeeeee"><td><a href="#EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC">Eq: equa ls メソッドはスーパークラスの equals メソッドをオーバーライドしているが、対称的ではないかもしれない</a></td><td>Correctness< /td></tr>
194 <tr bgcolor="#ffffff"><td><a href="#EQ_SELF_USE_OBJECT">Eq: 共変な equals メソッドを定義して 、Object.equals(Object) を継承している</a></td><td>Correctness</td></tr>
195 <tr bgcolor="#eeeeee"><td><a href="#FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER">FE: NaN への 等価性のための絶望的なテスト</a></td><td>Correctness</td></tr>
196 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_BAD_ARGUMENT">FS: 書式指示子へ渡して いる引数に互換性がない</a></td><td>Correctness</td></tr>
197 <tr bgcolor="#eeeeee"><td><a href="#VA_FORMAT_STRING_BAD_CONVERSION">FS: 与えられた引数 の型は書式指示子に合致しません</a></td><td>Correctness</td></tr>
198 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUP PLIED">FS: printf スタイルの書式が期待されているところで MessageFormat が与えられている</a></td><td>Correct ness</td></tr>
199 <tr bgcolor="#eeeeee"><td><a href="#VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED">FS: 書式文字列で実際に使われるより、多くの引数が渡されている</a></td><td>Correctness</td></tr>
200 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_ILLEGAL">FS: 無効な書式文字列</a></ td><td>Correctness</td></tr>
201 <tr bgcolor="#eeeeee"><td><a href="#VA_FORMAT_STRING_MISSING_ARGUMENT">FS: 書式文字列 は足りない引数を参照している</a></td><td>Correctness</td></tr>
202 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT">FS: 書 式文字列ための前の引数がない</a></td><td>Correctness</td></tr>
203 <tr bgcolor="#eeeeee"><td><a href="#GC_UNRELATED_TYPES">GC: 型パラメータとメソッド引数に関係がない< /a></td><td>Correctness</td></tr>
204 <tr bgcolor="#ffffff"><td><a href="#HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_ CLASS">HE: ハッシュ化された文脈でハッシュ化できないクラスの使用がシグネチャで宣言されている</a></td><td>Correctness</td> </tr>
205 <tr bgcolor="#eeeeee"><td><a href="#HE_USE_OF_UNHASHABLE_CLASS">HE: ハッシュデータ構造で h ashCode メソッドのないクラスを使用している</a></td><td>Correctness</td></tr>
206 <tr bgcolor="#ffffff"><td><a href="#ICAST_INT_2_LONG_AS_INSTANT">ICAST: int 値を l ong に変換して絶対時間として使用している</a></td><td>Correctness</td></tr>
207 <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>
208 <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>
209 <tr bgcolor="#eeeeee"><td><a href="#IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD">I JU: run メソッドでの JUnit アサーションは JUnit によって通知されない</a></td><td>Correctness</td></tr>
210 <tr bgcolor="#ffffff"><td><a href="#IJU_BAD_SUITE_METHOD">IJU: TestCase は suite メソッドの間違った宣言をしている</a></td><td>Correctness</td></tr>
211 <tr bgcolor="#eeeeee"><td><a href="#IJU_NO_TESTS">IJU: TestCase はテストがない </a></td ><td>Correctness</td></tr>
212 <tr bgcolor="#ffffff"><td><a href="#IJU_SETUP_NO_SUPER">IJU: TestCase は super.se tup() を呼び出さない setUp メソッドを実装している</a></td><td>Correctness</td></tr>
213 <tr bgcolor="#eeeeee"><td><a href="#IJU_SUITE_NOT_STATIC">IJU: TestCase は 非 stat ic な suite メソッドを実装している</a></td><td>Correctness</td></tr>
214 <tr bgcolor="#ffffff"><td><a href="#IJU_TEARDOWN_NO_SUPER">IJU: TestCase は super .tearDown() を呼び出さない tearDown メソッドを実装している </a></td><td>Correctness</td></tr>
215 <tr bgcolor="#eeeeee"><td><a href="#IL_CONTAINER_ADDED_TO_ITSELF">IL: コレクションは自分自 身を追加している</a></td><td>Correctness</td></tr>
216 <tr bgcolor="#ffffff"><td><a href="#IL_INFINITE_LOOP">IL: 明らかな無限ループ</a></td><td> Correctness</td></tr>
217 <tr bgcolor="#eeeeee"><td><a href="#IL_INFINITE_RECURSIVE_LOOP">IL: 明らかな無限再帰ループ< /a></td><td>Correctness</td></tr>
218 <tr bgcolor="#ffffff"><td><a href="#IM_MULTIPLYING_RESULT_OF_IREM">IM: 整数剰余の結果の整 数乗算</a></td><td>Correctness</td></tr>
219 <tr bgcolor="#eeeeee"><td><a href="#INT_BAD_COMPARISON_WITH_INT_VALUE">INT: int 値と long 定数との間違った比較</a></td><td>Correctness</td></tr>
220 <tr bgcolor="#ffffff"><td><a href="#INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE">I NT: 負でない値と負の定数またはゼロとの間違った比較</a></td><td>Correctness</td></tr>
221 <tr bgcolor="#eeeeee"><td><a href="#INT_BAD_COMPARISON_WITH_SIGNED_BYTE">INT: 符号 付きバイトの間違った比較</a></td><td>Correctness</td></tr>
222 <tr bgcolor="#ffffff"><td><a href="#IO_APPENDING_TO_OBJECT_OUTPUT_STREAM">IO: オブ ジェクト出力ストリームへの追加は失敗に終わる</a></td><td>Correctness</td></tr>
223 <tr bgcolor="#eeeeee"><td><a href="#IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN">IP: メソ ッドで読み取られずに上書きされているパラメータ</a></td><td>Correctness</td></tr>
224 <tr bgcolor="#ffffff"><td><a href="#MF_CLASS_MASKS_FIELD">MF: スーパークラスのフィールドを隠すフィ ールドを定義しているクラス</a></td><td>Correctness</td></tr>
225 <tr bgcolor="#eeeeee"><td><a href="#MF_METHOD_MASKS_FIELD">MF: フィールドを隠す変数を定義している メソッド</a></td><td>Correctness</td></tr>
226 <tr bgcolor="#ffffff"><td><a href="#NP_ALWAYS_NULL">NP: null 値を利用している</a></td><t d>Correctness</td></tr>
227 <tr bgcolor="#eeeeee"><td><a href="#NP_ALWAYS_NULL_EXCEPTION">NP: null 値を例外経路で利用 している</a></td><td>Correctness</td></tr>
228 <tr bgcolor="#ffffff"><td><a href="#NP_ARGUMENT_MIGHT_BE_NULL">NP: null の引数をチェック していないメソッド</a></td><td>Correctness</td></tr>
229 <tr bgcolor="#eeeeee"><td><a href="#NP_CLOSING_NULL">NP: 常に null 値のオブジェクトで close メソッドを呼び出している</a></td><td>Correctness</td></tr>
230 <tr bgcolor="#ffffff"><td><a href="#NP_GUARANTEED_DEREF">NP: null 値を利用することが保証されて いる</a></td><td>Correctness</td></tr>
231 <tr bgcolor="#eeeeee"><td><a href="#NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH">NP: n ull 値を例外経路で利用することが保証されている</a></td><td>Correctness</td></tr>
232 <tr bgcolor="#ffffff"><td><a href="#NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUC TOR">NP: 非 null フィールドは初期化されていない</a></td><td>Correctness</td></tr>
233 <tr bgcolor="#eeeeee"><td><a href="#NP_NONNULL_PARAM_VIOLATION">NP: メソッド呼び出しは非 n ull パラメータに対して null を渡している</a></td><td>Correctness</td></tr>
234 <tr bgcolor="#ffffff"><td><a href="#NP_NONNULL_RETURN_VIOLATION">NP: null を返すかもし れないメソッドが @Nonnull 宣言されている</a></td><td>Correctness</td></tr>
235 <tr bgcolor="#eeeeee"><td><a href="#NP_NULL_INSTANCEOF">NP: null とわかっている値をその型のイン スタンスなのか確かめている</a></td><td>Correctness</td></tr>
236 <tr bgcolor="#ffffff"><td><a href="#NP_NULL_ON_SOME_PATH">NP: null 値を利用している可能性があ る</a></td><td>Correctness</td></tr>
237 <tr bgcolor="#eeeeee"><td><a href="#NP_NULL_ON_SOME_PATH_EXCEPTION">NP: null 値を例 外経路で利用している可能性がある</a></td><td>Correctness</td></tr>
238 <tr bgcolor="#ffffff"><td><a href="#NP_NULL_PARAM_DEREF">NP: メソッド呼び出しは非 null パラメ ータに対して null を渡している</a></td><td>Correctness</td></tr>
239 <tr bgcolor="#eeeeee"><td><a href="#NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS">N P: メソッド呼び出しは非 null パラメータに対して null を渡している</a></td><td>Correctness</td></tr>
240 <tr bgcolor="#ffffff"><td><a href="#NP_NULL_PARAM_DEREF_NONVIRTUAL">NP: 非 null パ ラメータに null を渡している非仮想メソッドの呼び出し</a></td><td>Correctness</td></tr>
241 <tr bgcolor="#eeeeee"><td><a href="#NP_OPTIONAL_RETURN_NULL">NP: Optional の戻り型を持 つメソッドが明示的に null を返す</a></td><td>Correctness</td></tr>
242 <tr bgcolor="#ffffff"><td><a href="#NP_STORE_INTO_NONNULL_FIELD">NP: @Nonnull でア ノテートされたフィールドに null を格納している</a></td><td>Correctness</td></tr>
243 <tr bgcolor="#eeeeee"><td><a href="#NP_UNWRITTEN_FIELD">NP: 書き込まれていないフィールドの読み出し< /a></td><td>Correctness</td></tr>
244 <tr bgcolor="#ffffff"><td><a href="#NM_BAD_EQUAL">Nm: クラスは equal(Object) を定義していま す。equals(Object) にすべきですか?</a></td><td>Correctness</td></tr>
245 <tr bgcolor="#eeeeee"><td><a href="#NM_LCASE_HASHCODE">Nm: クラスは hashcode() を定義して います。hashCode() にすべきですか?</a></td><td>Correctness</td></tr>
246 <tr bgcolor="#ffffff"><td><a href="#NM_LCASE_TOSTRING">Nm: クラスは tostring() を定義して います。toString() にすべきですか?</a></td><td>Correctness</td></tr>
247 <tr bgcolor="#eeeeee"><td><a href="#NM_METHOD_CONSTRUCTOR_CONFUSION">Nm: 明らかなメソッ ドとコンストラクタの混乱</a></td><td>Correctness</td></tr>
248 <tr bgcolor="#ffffff"><td><a href="#NM_VERY_CONFUSING">Nm: 非常に紛らわしい名前のメソッド</a></ td><td>Correctness</td></tr>
249 <tr bgcolor="#eeeeee"><td><a href="#NM_WRONG_PACKAGE">Nm: パラメータの間違ったパッケージのためにスーパ ークラスのメソッドをオーバーライドしていないメソッド</a></td><td>Correctness</td></tr>
250 <tr bgcolor="#ffffff"><td><a href="#QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT">QBA: 論理 式で boolean リテラル値を代入しているメソッド</a></td><td>Correctness</td></tr>
251 <tr bgcolor="#eeeeee"><td><a href="#RANGE_ARRAY_INDEX">RANGE: 配列インデックスは範囲外</a></ td><td>Correctness</td></tr>
252 <tr bgcolor="#ffffff"><td><a href="#RANGE_ARRAY_LENGTH">RANGE: 配列の長さは範囲外</a></td ><td>Correctness</td></tr>
253 <tr bgcolor="#eeeeee"><td><a href="#RANGE_ARRAY_OFFSET">RANGE: 配列オフセットは範囲外</a></ td><td>Correctness</td></tr>
254 <tr bgcolor="#ffffff"><td><a href="#RANGE_STRING_INDEX">RANGE: 文字列インデックスは範囲外</a> </td><td>Correctness</td></tr>
255 <tr bgcolor="#eeeeee"><td><a href="#RC_REF_COMPARISON">RC: 疑わしい参照比較</a></td><td> Correctness</td></tr>
256 <tr bgcolor="#ffffff"><td><a href="#RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NP E">RCN: 既に利用していた値の null チェック</a></td><td>Correctness</td></tr>
257 <tr bgcolor="#eeeeee"><td><a href="#RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION">RE: 正規 表現のための無効な構文</a></td><td>Correctness</td></tr>
258 <tr bgcolor="#ffffff"><td><a href="#RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRES SION">RE: 正規表現のために使われている File.separator</a></td><td>Correctness</td></tr>
259 <tr bgcolor="#eeeeee"><td><a href="#RE_POSSIBLE_UNINTENDED_PATTERN">RE: 正規表現のために 使われている "." または "|"</a></td><td>Correctness</td></tr>
260 <tr bgcolor="#ffffff"><td><a href="#RV_01_TO_INT">RV: 0から1の乱数値は整数値0に丸められる</a></t d><td>Correctness</td></tr>
261 <tr bgcolor="#eeeeee"><td><a href="#RV_ABSOLUTE_VALUE_OF_HASHCODE">RV: 符号付き32ビット ハッシュコードの絶対値を計算する間違った試み</a></td><td>Correctness</td></tr>
262 <tr bgcolor="#ffffff"><td><a href="#RV_ABSOLUTE_VALUE_OF_RANDOM_INT">RV: 符号付き整数の 乱数の絶対値を計算する間違った試み</a></td><td>Correctness</td></tr>
263 <tr bgcolor="#eeeeee"><td><a href="#RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE ">RV: compareTo によって返された特定の値のコードチェック</a></td><td>Correctness</td></tr>
264 <tr bgcolor="#ffffff"><td><a href="#RV_EXCEPTION_NOT_THROWN">RV: 作成した例外をスローするのでは なく捨てている</a></td><td>Correctness</td></tr>
265 <tr bgcolor="#eeeeee"><td><a href="#RV_RETURN_VALUE_IGNORED">RV: 戻り値を無視しているメソッド< /a></td><td>Correctness</td></tr>
266 <tr bgcolor="#ffffff"><td><a href="#RpC_REPEATED_CONDITIONAL_TEST">RpC: 条件テストの繰り 返し</a></td><td>Correctness</td></tr>
267 <tr bgcolor="#eeeeee"><td><a href="#SA_FIELD_SELF_ASSIGNMENT">SA: フィールドの自己代入</a> </td><td>Correctness</td></tr>
268 <tr bgcolor="#ffffff"><td><a href="#SA_FIELD_SELF_COMPARISON">SA: フィールドとそれ自身との自己 比較</a></td><td>Correctness</td></tr>
269 <tr bgcolor="#eeeeee"><td><a href="#SA_FIELD_SELF_COMPUTATION">SA: フィールドの無意味な自己演 算 (たとえば、 x & x)</a></td><td>Correctness</td></tr>
270 <tr bgcolor="#ffffff"><td><a href="#SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD">S A: フィールドへの代入ではなくローカル変数への自己代入</a></td><td>Correctness</td></tr>
271 <tr bgcolor="#eeeeee"><td><a href="#SA_LOCAL_SELF_COMPARISON">SA: ローカル変数とそれ自身との自 己比較</a></td><td>Correctness</td></tr>
272 <tr bgcolor="#ffffff"><td><a href="#SA_LOCAL_SELF_COMPUTATION">SA: 変数の無意味な自己演算 ( たとえば、x & x)</a></td><td>Correctness</td></tr>
273 <tr bgcolor="#eeeeee"><td><a href="#SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH">SF: switch 文のフォールスルーのために格納が無効になっている</a></td><td>Correctness</td></tr>
274 <tr bgcolor="#ffffff"><td><a href="#SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_T HROW">SF: スローする switch 文のフォールスルーのために格納が無効になっている</a></td><td>Correctness</td></tr >
275 <tr bgcolor="#eeeeee"><td><a href="#SIC_THREADLOCAL_DEADLY_EMBRACE">SIC: 非 stati c 内部クラスとスレッドローカルのデッドロック</a></td><td>Correctness</td></tr>
276 <tr bgcolor="#ffffff"><td><a href="#SIO_SUPERFLUOUS_INSTANCEOF">SIO: instanceof 演算子を使用した不必要な型チェック</a></td><td>Correctness</td></tr>
277 <tr bgcolor="#eeeeee"><td><a href="#SQL_BAD_PREPARED_STATEMENT_ACCESS">SQL: インデッ クスが0で PreparedStatement にアクセスしようとしているメソッド</a></td><td>Correctness</td></tr>
278 <tr bgcolor="#ffffff"><td><a href="#SQL_BAD_RESULTSET_ACCESS">SQL: インデックスが0で Res ultSet にアクセスしようとしているメソッド</a></td><td>Correctness</td></tr>
279 <tr bgcolor="#eeeeee"><td><a href="#STI_INTERRUPTED_ON_CURRENTTHREAD">STI: inter rupted メソッドを呼び出すために不要な currentThread メソッドを呼び出している</a></td><td>Correctness</td></ tr>
280 <tr bgcolor="#ffffff"><td><a href="#STI_INTERRUPTED_ON_UNKNOWNTHREAD">STI: スレッドイ ンスタンスで static Thread.interrupted() を呼び出している</a></td><td>Correctness</td></tr>
281 <tr bgcolor="#eeeeee"><td><a href="#SE_METHOD_MUST_BE_PRIVATE">Se: 直列化機構のために pri vate にしなければならないメソッド</a></td><td>Correctness</td></tr>
282 <tr bgcolor="#ffffff"><td><a href="#SE_READ_RESOLVE_IS_STATIC">Se: readResolve メ ソッドが static メソッドとして宣言されている</a></td><td>Correctness</td></tr>
283 <tr bgcolor="#eeeeee"><td><a href="#TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED">T Q: 型修飾子でアノテーションされた値がその修飾子を付けてはならない値を必要とする場所で使われている</a></td><td>Correctness</td>< /tr>
284 <tr bgcolor="#ffffff"><td><a href="#TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_Q UALIFIERS">TQ: 互換性のない型修飾子による比較値</a></td><td>Correctness</td></tr>
285 <tr bgcolor="#eeeeee"><td><a href="#TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK">T Q: 型修飾子を付けていないかもしれない値がその型修飾子を必要とする方法で常に使われている</a></td><td>Correctness</td></tr>
286 <tr bgcolor="#ffffff"><td><a href="#TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK">TQ : 型修飾子を付けているかもしれない値がその型修飾子を禁止する方法で常に使われている</a></td><td>Correctness</td></tr>
287 <tr bgcolor="#eeeeee"><td><a href="#TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED">T Q: 型修飾子でアノテートされていない値がその修飾子が付けられた値を必要とする場所で使われている</a></td><td>Correctness</td></t r>
288 <tr bgcolor="#ffffff"><td><a href="#TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_ REQUIRED">TQ: 型修飾子がない値が修飾子を必要とする場所で使われている</a></td><td>Correctness</td></tr>
289 <tr bgcolor="#eeeeee"><td><a href="#UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS">U MAC: 呼び出し不可能なメソッドが無名クラスで定義されている</a></td><td>Correctness</td></tr>
290 <tr bgcolor="#ffffff"><td><a href="#UR_UNINIT_READ">UR: コンストラクタで初期化されていないフィールドを読 み出している</a></td><td>Correctness</td></tr>
291 <tr bgcolor="#eeeeee"><td><a href="#UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR ">UR: スーパークラスのコンストラクタから呼び出されるメソッドで初期化されていないフィールドを読み出している</a></td><td>Correctness </td></tr>
292 <tr bgcolor="#ffffff"><td><a href="#DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY">US ELESS_STRING: 名前のない配列で toString メソッドを呼び出している</a></td><td>Correctness</td></tr>
293 <tr bgcolor="#eeeeee"><td><a href="#DMI_INVOKING_TOSTRING_ON_ARRAY">USELESS_STRI NG: 配列で toString メソッドを呼び出している</a></td><td>Correctness</td></tr>
294 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY"> USELESS_STRING: 書式文字列を使用して役に立たない方法で配列をフォーマットしている</a></td><td>Correctness</td></t r>
295 <tr bgcolor="#eeeeee"><td><a href="#UWF_NULL_FIELD">UwF: null に設定されるだけのフィールド</a> </td><td>Correctness</td></tr>
296 <tr bgcolor="#ffffff"><td><a href="#UWF_UNWRITTEN_FIELD">UwF: 書き込まれていないフィールド</a> </td><td>Correctness</td></tr>
297 <tr bgcolor="#eeeeee"><td><a href="#VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG"> VA: 可変長引数を期待しているメソッドにプリミティブ型の配列を渡している</a></td><td>Correctness</td></tr>
298 <tr bgcolor="#ffffff"><td><a href="#LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE">LG: ロガ ーの変更は OpenJDK の弱参照が原因で潜在的に失われる</a></td><td>Experimental</td></tr>
299 <tr bgcolor="#eeeeee"><td><a href="#OBL_UNSATISFIED_OBLIGATION">OBL: ストリームやリソースの クリーンアップに失敗するかもしれないメソッド</a></td><td>Experimental</td></tr>
300 <tr bgcolor="#ffffff"><td><a href="#OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE">O BL: チェック例外でストリームやリソースのクリーンアップに失敗するかもしれないメソッド</a></td><td>Experimental</td></tr>
301 <tr bgcolor="#eeeeee"><td><a href="#DM_CONVERT_CASE">Dm: 呼び出したメソッドの Locale パラメータ の使用を検討する</a></td><td>Internationalization</td></tr>
302 <tr bgcolor="#ffffff"><td><a href="#DM_DEFAULT_ENCODING">Dm: デフォルトエンコーディングへの依存</ a></td><td>Internationalization</td></tr>
303 <tr bgcolor="#eeeeee"><td><a href="#DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED"> DP: doPrivileged ブロック内で作成されるべきクラスローダ</a></td><td>Malicious code vulnerability</t d></tr>
304 <tr bgcolor="#ffffff"><td><a href="#DP_DO_INSIDE_DO_PRIVILEGED">DP: doPrivileged ブロック内で呼び出すべきメソッド</a></td><td>Malicious code vulnerability</td></tr>
305 <tr bgcolor="#eeeeee"><td><a href="#EI_EXPOSE_REP">EI: 可変オブジェクトへの参照を返すことによって内部表現 を暴露するかもしれないメソッド</a></td><td>Malicious code vulnerability</td></tr>
306 <tr bgcolor="#ffffff"><td><a href="#EI_EXPOSE_REP2">EI2: 可変オブジェクトへの参照を取り込むことによって 内部表現を暴露するかもしれないメソッド</a></td><td>Malicious code vulnerability</td></tr>
307 <tr bgcolor="#eeeeee"><td><a href="#FI_PUBLIC_SHOULD_BE_PROTECTED">FI: ファイナライザは public ではなく protected にすべき</a></td><td>Malicious code vulnerability</td></tr>
308 <tr bgcolor="#ffffff"><td><a href="#EI_EXPOSE_STATIC_REP2">MS: static フィールドに可変オブ ジェクトを格納することによって、内部の静的状態を暴露するかもしれないメソッド</a></td><td>Malicious code vulnerability< /td></tr>
309 <tr bgcolor="#eeeeee"><td><a href="#MS_CANNOT_BE_FINAL">MS: final でないフィールドは悪意のある コードから保護できない</a></td><td>Malicious code vulnerability</td></tr>
310 <tr bgcolor="#ffffff"><td><a href="#MS_EXPOSE_REP">MS: 配列を返すことによって内部表現を暴露するかもしれな い public static メソッド</a></td><td>Malicious code vulnerability</td></tr>
311 <tr bgcolor="#eeeeee"><td><a href="#MS_FINAL_PKGPROTECT">MS: final かつパッケージプロテクテッ ドにすべきフィールド</a></td><td>Malicious code vulnerability</td></tr>
312 <tr bgcolor="#ffffff"><td><a href="#MS_MUTABLE_ARRAY">MS: 可変配列のフィールド</a></td><td >Malicious code vulnerability</td></tr>
313 <tr bgcolor="#eeeeee"><td><a href="#MS_MUTABLE_COLLECTION">MS: 可変コレクションのフィールド</a ></td><td>Malicious code vulnerability</td></tr>
314 <tr bgcolor="#ffffff"><td><a href="#MS_MUTABLE_COLLECTION_PKGPROTECT">MS: パッケージプ ロテクテッドにすべき可変コレクションのフィールド</a></td><td>Malicious code vulnerability</td></tr>
315 <tr bgcolor="#eeeeee"><td><a href="#MS_MUTABLE_HASHTABLE">MS: 可変 Hashtable のフィール ド</a></td><td>Malicious code vulnerability</td></tr>
316 <tr bgcolor="#ffffff"><td><a href="#MS_OOI_PKGPROTECT">MS: インタフェースから移動してパッケージプロテ クテッドにすべきフィールド</a></td><td>Malicious code vulnerability</td></tr>
317 <tr bgcolor="#eeeeee"><td><a href="#MS_PKGPROTECT">MS: パッケージプロテクテッドにすべきフィールド</a> </td><td>Malicious code vulnerability</td></tr>
318 <tr bgcolor="#ffffff"><td><a href="#MS_SHOULD_BE_FINAL">MS: final にすべきフィールド</a>< /td><td>Malicious code vulnerability</td></tr>
319 <tr bgcolor="#eeeeee"><td><a href="#MS_SHOULD_BE_REFACTORED_TO_BE_FINAL">MS: fin al でないフィールドはリファクタリングするべき</a></td><td>Malicious code vulnerability</td></tr>
320 <tr bgcolor="#ffffff"><td><a href="#AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACT ION">AT: 並行抽象の呼び出しシーケンスはアトミックではないかもしれない</a></td><td>Multithreaded correctness</t d></tr>
321 <tr bgcolor="#eeeeee"><td><a href="#DC_DOUBLECHECK">DC: フィールドのダブルチェックの可能性</a></t d><td>Multithreaded correctness</td></tr>
322 <tr bgcolor="#ffffff"><td><a href="#DC_PARTIALLY_CONSTRUCTED">DC: 部分的に初期化されたオブジェ クトを暴露する可能性がある</a></td><td>Multithreaded correctness</td></tr>
323 <tr bgcolor="#eeeeee"><td><a href="#DL_SYNCHRONIZATION_ON_BOOLEAN">DL: Boolean の 同期化</a></td><td>Multithreaded correctness</td></tr>
324 <tr bgcolor="#ffffff"><td><a href="#DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE">DL: デ ッドロックの原因になる可能性があるボクシングされたプリミティブ型の同期化</a></td><td>Multithreaded correctness</td>< /tr>
325 <tr bgcolor="#eeeeee"><td><a href="#DL_SYNCHRONIZATION_ON_SHARED_CONSTANT">DL: 正 準化した文字列の同期化</a></td><td>Multithreaded correctness</td></tr>
326 <tr bgcolor="#ffffff"><td><a href="#DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITI VE">DL: ボクシングされたプリミティブ値の同期化</a></td><td>Multithreaded correctness</td></tr>
327 <tr bgcolor="#eeeeee"><td><a href="#DM_MONITOR_WAIT_ON_CONDITION">Dm: Condition で wait メソッドを呼び出している</a></td><td>Multithreaded correctness</td></tr>
328 <tr bgcolor="#ffffff"><td><a href="#DM_USELESS_THREAD">Dm: デフォルトの空の run メソッドを使用し て作成されたスレッド</a></td><td>Multithreaded correctness</td></tr>
329 <tr bgcolor="#eeeeee"><td><a href="#ESync_EMPTY_SYNC">ESync: 空の synchronized ブロッ ク</a></td><td>Multithreaded correctness</td></tr>
330 <tr bgcolor="#ffffff"><td><a href="#IS2_INCONSISTENT_SYNC">IS: 一貫性のない同期化</a></td ><td>Multithreaded correctness</td></tr>
331 <tr bgcolor="#eeeeee"><td><a href="#IS_FIELD_NOT_GUARDED">IS: 並行アクセスに対してガードされていな いフィールド</a></td><td>Multithreaded correctness</td></tr>
332 <tr bgcolor="#ffffff"><td><a href="#JLM_JSR166_LOCK_MONITORENTER">JLM: Lock で同期化 している</a></td><td>Multithreaded correctness</td></tr>
333 <tr bgcolor="#eeeeee"><td><a href="#JLM_JSR166_UTILCONCURRENT_MONITORENTER">JLM: java.util.concurrent のインスタンスで同期化している</a></td><td>Multithreaded correctness</td> </tr>
334 <tr bgcolor="#ffffff"><td><a href="#JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT">J LM: util.concurrent 抽象でモニタスタイルの wait メソッドを使用している</a></td><td>Multithreaded corre ctness</td></tr>
335 <tr bgcolor="#eeeeee"><td><a href="#LI_LAZY_INIT_STATIC">LI: static フィールドの間違った遅延 初期化</a></td><td>Multithreaded correctness</td></tr>
336 <tr bgcolor="#ffffff"><td><a href="#LI_LAZY_INIT_UPDATE_STATIC">LI: 更新される static フィールドの間違った遅延初期化</a></td><td>Multithreaded correctness</td></tr>
337 <tr bgcolor="#eeeeee"><td><a href="#ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIEL D">ML: フィールドを同期化でガードしようとする無駄な試み</a></td><td>Multithreaded correctness</td></tr>
338 <tr bgcolor="#ffffff"><td><a href="#ML_SYNC_ON_UPDATED_FIELD">ML: 更新されるフィールドで同期化 しているメソッド</a></td><td>Multithreaded correctness</td></tr>
339 <tr bgcolor="#eeeeee"><td><a href="#MSF_MUTABLE_SERVLET_FIELD">MSF: 可変サーブレットフィール ド</a></td><td>Multithreaded correctness</td></tr>
340 <tr bgcolor="#ffffff"><td><a href="#MWN_MISMATCHED_NOTIFY">MWN: 不整合な notify メソッド </a></td><td>Multithreaded correctness</td></tr>
341 <tr bgcolor="#eeeeee"><td><a href="#MWN_MISMATCHED_WAIT">MWN: 不整合な wait メソッド</a> </td><td>Multithreaded correctness</td></tr>
342 <tr bgcolor="#ffffff"><td><a href="#NN_NAKED_NOTIFY">NN: 裸の notify メソッド</a></td> <td>Multithreaded correctness</td></tr>
343 <tr bgcolor="#eeeeee"><td><a href="#NP_SYNC_AND_NULL_CHECK_FIELD">NP: 同じフィールドでの同 期化と null チェック</a></td><td>Multithreaded correctness</td></tr>
344 <tr bgcolor="#ffffff"><td><a href="#NO_NOTIFY_NOT_NOTIFYALL">No: notifyAll メソッドで はなく notify メソッドを使用している</a></td><td>Multithreaded correctness</td></tr>
345 <tr bgcolor="#eeeeee"><td><a href="#RS_READOBJECT_SYNC">RS: readObject メソッドを同期化し ているクラス</a></td><td>Multithreaded correctness</td></tr>
346 <tr bgcolor="#ffffff"><td><a href="#RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED">RV: putIfAbsent の戻り値は無視されて putIfAbsent に渡した値は再利用された</a></td><td>Multithreaded correc tness</td></tr>
347 <tr bgcolor="#eeeeee"><td><a href="#RU_INVOKE_RUN">Ru: スレッドで run メソッドを呼び出している</a ></td><td>Multithreaded correctness</td></tr>
348 <tr bgcolor="#ffffff"><td><a href="#SC_START_IN_CTOR">SC: Thread.start() を呼び出してい るコンストラクタ</a></td><td>Multithreaded correctness</td></tr>
349 <tr bgcolor="#eeeeee"><td><a href="#SP_SPIN_ON_FIELD">SP: スピンロックをしているメソッド</a></t d><td>Multithreaded correctness</td></tr>
350 <tr bgcolor="#ffffff"><td><a href="#STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE">ST CAL: static Calendar の呼び出し</a></td><td>Multithreaded correctness</td></tr>
351 <tr bgcolor="#eeeeee"><td><a href="#STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE" >STCAL: static DateFormat の呼び出し</a></td><td>Multithreaded correctness</td></tr>
352 <tr bgcolor="#ffffff"><td><a href="#STCAL_STATIC_CALENDAR_INSTANCE">STCAL: stati c Calendar フィールド</a></td><td>Multithreaded correctness</td></tr>
353 <tr bgcolor="#eeeeee"><td><a href="#STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE">ST CAL: static DateFormat</a></td><td>Multithreaded correctness</td></tr>
354 <tr bgcolor="#ffffff"><td><a href="#SWL_SLEEP_WITH_LOCK_HELD">SWL: ロックを保持して Thre ad.sleep() を呼び出しているメソッド</a></td><td>Multithreaded correctness</td></tr>
355 <tr bgcolor="#eeeeee"><td><a href="#TLW_TWO_LOCK_WAIT">TLW: 2つ以上のロックを保持して wait メ ソッドを呼び出している</a></td><td>Multithreaded correctness</td></tr>
356 <tr bgcolor="#ffffff"><td><a href="#UG_SYNC_SET_UNSYNC_GET">UG: 同期化していない get メソッ ド、同期化している set メソッド</a></td><td>Multithreaded correctness</td></tr>
357 <tr bgcolor="#eeeeee"><td><a href="#UL_UNRELEASED_LOCK">UL: すべての経路でロックが解除されないメソッ ド</a></td><td>Multithreaded correctness</td></tr>
358 <tr bgcolor="#ffffff"><td><a href="#UL_UNRELEASED_LOCK_EXCEPTION_PATH">UL: すべての例 外経路でロックが解除されないメソッド</a></td><td>Multithreaded correctness</td></tr>
359 <tr bgcolor="#eeeeee"><td><a href="#UW_UNCOND_WAIT">UW: wait メソッドの無条件呼び出し</a></t d><td>Multithreaded correctness</td></tr>
360 <tr bgcolor="#ffffff"><td><a href="#VO_VOLATILE_INCREMENT">VO: volatile フィールドへのイ ンクリメントはアトミックではない</a></td><td>Multithreaded correctness</td></tr>
361 <tr bgcolor="#eeeeee"><td><a href="#VO_VOLATILE_REFERENCE_TO_ARRAY">VO: 配列への vol atile 参照は、配列要素を volatile として扱わない</a></td><td>Multithreaded correctness</td></tr>
362 <tr bgcolor="#ffffff"><td><a href="#WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL" >WL: クラスリテラルではなく getClass で同期化している</a></td><td>Multithreaded correctness</td></t r>
363 <tr bgcolor="#eeeeee"><td><a href="#WS_WRITEOBJECT_SYNC">WS: writeObject メソッドは同期 化しているがその他のメソッドは同期化していないクラス</a></td><td>Multithreaded correctness</td></tr>
364 <tr bgcolor="#ffffff"><td><a href="#WA_AWAIT_NOT_IN_LOOP">Wa: Condition.await() がループの中にない</a></td><td>Multithreaded correctness</td></tr>
365 <tr bgcolor="#eeeeee"><td><a href="#WA_NOT_IN_LOOP">Wa: wait メソッドがループの中にない</a></ td><td>Multithreaded correctness</td></tr>
366 <tr bgcolor="#ffffff"><td><a href="#BX_BOXING_IMMEDIATELY_UNBOXED">Bx: プリミティブ値がボ クシングされて、すぐにアンボクシングされる</a></td><td>Performance</td></tr>
367 <tr bgcolor="#eeeeee"><td><a href="#BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COE RCION">Bx: プリミティブ値がプリミティブ型の型変換をするためにボクシングされて、アンボクシングされる</a></td><td>Performance< /td></tr>
368 <tr bgcolor="#ffffff"><td><a href="#BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR" >Bx: プリミティブ値が3項演算子のためにアンボクシングされて、型変換される</a></td><td>Performance</td></tr>
369 <tr bgcolor="#eeeeee"><td><a href="#BX_UNBOXING_IMMEDIATELY_REBOXED">Bx: ボクシングされ た値がアンボクシングされて、すぐに再ボクシングされる</a></td><td>Performance</td></tr>
370 <tr bgcolor="#ffffff"><td><a href="#DM_BOXED_PRIMITIVE_FOR_COMPARE">Bx: プリミティブが比 較でボクシングされている</a></td><td>Performance</td></tr>
371 <tr bgcolor="#eeeeee"><td><a href="#DM_BOXED_PRIMITIVE_FOR_PARSING">Bx: ボクシング/アン ボクシングはプリミティブを解析する</a></td><td>Performance</td></tr>
372 <tr bgcolor="#ffffff"><td><a href="#DM_BOXED_PRIMITIVE_TOSTRING">Bx: toString メソ ッドを呼び出すためにプリミティブ型のラッパクラスのインスタンスを作成している</a></td><td>Performance</td></tr>
373 <tr bgcolor="#eeeeee"><td><a href="#DM_FP_NUMBER_CTOR">Bx: 効率が悪い浮動小数点 Number コンス トラクタを呼び出しているメソッド</a></td><td>Performance</td></tr>
374 <tr bgcolor="#ffffff"><td><a href="#DM_NUMBER_CTOR">Bx: 効率が悪い Number コンストラクタを呼び出 しているメソッド</a></td><td>Performance</td></tr>
375 <tr bgcolor="#eeeeee"><td><a href="#DMI_BLOCKING_METHODS_ON_URL">Dm: URL の equal s メソッドと hashCode メソッドはブロックする</a></td><td>Performance</td></tr>
376 <tr bgcolor="#ffffff"><td><a href="#DMI_COLLECTION_OF_URLS">Dm: URL の Map や Set はひどい性能になる</a></td><td>Performance</td></tr>
377 <tr bgcolor="#eeeeee"><td><a href="#DM_BOOLEAN_CTOR">Dm: 効率が悪い Boolean コンストラクタを呼 び出しているメソッド</a></td><td>Performance</td></tr>
378 <tr bgcolor="#ffffff"><td><a href="#DM_GC">Dm: 明示的なガベージコレクション</a></td><td>Perfor mance</td></tr>
379 <tr bgcolor="#eeeeee"><td><a href="#DM_NEW_FOR_GETCLASS">Dm: クラスオブジェクトを得るためだけにイン スタンスを作成しているメソッド</a></td><td>Performance</td></tr>
380 <tr bgcolor="#ffffff"><td><a href="#DM_NEXTINT_VIA_NEXTDOUBLE">Dm: 整数の乱数を生成するために は nextDouble メソッド ではなく nextInt メソッドを使用する</a></td><td>Performance</td></tr>
381 <tr bgcolor="#eeeeee"><td><a href="#DM_STRING_CTOR">Dm: 効率が悪い new String(String) コンストラクタを呼び出しているメソッド</a></td><td>Performance</td></tr>
382 <tr bgcolor="#ffffff"><td><a href="#DM_STRING_TOSTRING">Dm: String の toString メソ ッドを呼び出しているメソッド</a></td><td>Performance</td></tr>
383 <tr bgcolor="#eeeeee"><td><a href="#DM_STRING_VOID_CTOR">Dm: 効率が悪い new String() コンストラクタを呼び出しているメソッド</a></td><td>Performance</td></tr>
384 <tr bgcolor="#ffffff"><td><a href="#HSC_HUGE_SHARED_STRING_CONSTANT">HSC: 複数のクラス ファイルにわたって複製されている巨大な文字列定数</a></td><td>Performance</td></tr>
385 <tr bgcolor="#eeeeee"><td><a href="#SBSC_USE_STRINGBUFFER_CONCATENATION">SBSC: ル ープの中で + を使用して文字列を連結しているメソッド</a></td><td>Performance</td></tr>
386 <tr bgcolor="#ffffff"><td><a href="#SIC_INNER_SHOULD_BE_STATIC">SIC: static 内部クラ スにすべき</a></td><td>Performance</td></tr>
387 <tr bgcolor="#eeeeee"><td><a href="#SIC_INNER_SHOULD_BE_STATIC_ANON">SIC: 名前付き s tatic 内部クラスにリファクタリングできるかもしれない</a></td><td>Performance</td></tr>
388 <tr bgcolor="#ffffff"><td><a href="#SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS">SIC: static 内部クラスにリファクタリングできるかもしれない</a></td><td>Performance</td></tr>
389 <tr bgcolor="#eeeeee"><td><a href="#SS_SHOULD_BE_STATIC">SS: 読み出されないフィールド</a></t d><td>Performance</td></tr>
390 <tr bgcolor="#ffffff"><td><a href="#UM_UNNECESSARY_MATH">UM: 定数値で Math クラスの stat ic メソッドを呼び出しているメソッド</a></td><td>Performance</td></tr>
391 <tr bgcolor="#eeeeee"><td><a href="#UPM_UNCALLED_PRIVATE_METHOD">UPM: private メソ ッドは決して呼び出されない</a></td><td>Performance</td></tr>
392 <tr bgcolor="#ffffff"><td><a href="#URF_UNREAD_FIELD">UrF: 読み出されないフィールド</a></td> <td>Performance</td></tr>
393 <tr bgcolor="#eeeeee"><td><a href="#UUF_UNUSED_FIELD">UuF: 未使用のフィールド</a></td><td >Performance</td></tr>
394 <tr bgcolor="#ffffff"><td><a href="#WMI_WRONG_MAP_ITERATOR">WMI: entrySet イテレータで はなく効率が悪い keySet イテレータを使用している</a></td><td>Performance</td></tr>
395 <tr bgcolor="#eeeeee"><td><a href="#DMI_CONSTANT_DB_PASSWORD">Dm: ハードコードされた定数データ ベースパスワード</a></td><td>Security</td></tr>
396 <tr bgcolor="#ffffff"><td><a href="#DMI_EMPTY_DB_PASSWORD">Dm: 空のデータベースパスワード</a> </td><td>Security</td></tr>
397 <tr bgcolor="#eeeeee"><td><a href="#HRS_REQUEST_PARAMETER_TO_COOKIE">HRS: 信頼できない 入力から形成された HTTP cookie</a></td><td>Security</td></tr>
398 <tr bgcolor="#ffffff"><td><a href="#HRS_REQUEST_PARAMETER_TO_HTTP_HEADER">HRS: H TTP レスポンススプリッティング脆弱性</a></td><td>Security</td></tr>
399 <tr bgcolor="#eeeeee"><td><a href="#PT_ABSOLUTE_PATH_TRAVERSAL">PT: サーブレットの絶対パスト ラバーサル</a></td><td>Security</td></tr>
400 <tr bgcolor="#ffffff"><td><a href="#PT_RELATIVE_PATH_TRAVERSAL">PT: サーブレットの相対パスト ラバーサル</a></td><td>Security</td></tr>
401 <tr bgcolor="#eeeeee"><td><a href="#SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE">SQ L: SQL の Statement の execute または addBatch メソッドに定数でない文字列を渡している</a></td><td>Secur ity</td></tr>
402 <tr bgcolor="#ffffff"><td><a href="#SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCON STANT_STRING">SQL: PreparedStatement が定数でない文字列から生成されている</a></td><td>Security</td ></tr>
403 <tr bgcolor="#eeeeee"><td><a href="#XSS_REQUEST_PARAMETER_TO_JSP_WRITER">XSS: 反射 型クロスサイトスクリプティング脆弱性がある JSP</a></td><td>Security</td></tr>
404 <tr bgcolor="#ffffff"><td><a href="#XSS_REQUEST_PARAMETER_TO_SEND_ERROR">XSS: 反射 型クロスサイトスクリプティング脆弱性がエラーページにあるサーブレット</a></td><td>Security</td></tr>
405 <tr bgcolor="#eeeeee"><td><a href="#XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER">XSS : 反射型クロスサイトスクリプティング脆弱性があるサーブレット</a></td><td>Security</td></tr>
406 <tr bgcolor="#ffffff"><td><a href="#BC_BAD_CAST_TO_ABSTRACT_COLLECTION">BC: 抽象コレ クションへの疑わしいキャスト</a></td><td>Dodgy code</td></tr>
407 <tr bgcolor="#eeeeee"><td><a href="#BC_BAD_CAST_TO_CONCRETE_COLLECTION">BC: 具象コレ クションへの疑わしいキャスト</a></td><td>Dodgy code</td></tr>
408 <tr bgcolor="#ffffff"><td><a href="#BC_UNCONFIRMED_CAST">BC: 未チェック/未確認のキャスト</a>< /td><td>Dodgy code</td></tr>
409 <tr bgcolor="#eeeeee"><td><a href="#BC_UNCONFIRMED_CAST_OF_RETURN_VALUE">BC: メソッ ドからの戻り値の未チェック/未確認のキャスト</a></td><td>Dodgy code</td></tr>
410 <tr bgcolor="#ffffff"><td><a href="#BC_VACUOUS_INSTANCEOF">BC: 常に true を返す insta nceof</a></td><td>Dodgy code</td></tr>
411 <tr bgcolor="#eeeeee"><td><a href="#ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT">BSH IFT: 符号なし右シフトを short/byte にキャストしている</a></td><td>Dodgy code</td></tr>
412 <tr bgcolor="#ffffff"><td><a href="#CI_CONFUSED_INHERITANCE">CI: final なクラスが pro tected フィールドを宣言している</a></td><td>Dodgy code</td></tr>
413 <tr bgcolor="#eeeeee"><td><a href="#DB_DUPLICATE_BRANCHES">DB: 2つの分岐のために同じコードを使用 しているメソッド</a></td><td>Dodgy code</td></tr>
414 <tr bgcolor="#ffffff"><td><a href="#DB_DUPLICATE_SWITCH_CLAUSES">DB: switch 文の2つ の case のために同じコードを使用しているメソッド</a></td><td>Dodgy code</td></tr>
415 <tr bgcolor="#eeeeee"><td><a href="#DLS_DEAD_LOCAL_STORE">DLS: ローカル変数への無効な代入</a> </td><td>Dodgy code</td></tr>
416 <tr bgcolor="#ffffff"><td><a href="#DLS_DEAD_LOCAL_STORE_IN_RETURN">DLS: return 文に役に立たない代入がある</a></td><td>Dodgy code</td></tr>
417 <tr bgcolor="#eeeeee"><td><a href="#DLS_DEAD_LOCAL_STORE_OF_NULL">DLS: ローカル変数への無 効な null 代入</a></td><td>Dodgy code</td></tr>
418 <tr bgcolor="#ffffff"><td><a href="#DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD">DLS: フィー ルドを遮るローカル変数への無効な代入</a></td><td>Dodgy code</td></tr>
419 <tr bgcolor="#eeeeee"><td><a href="#DMI_HARDCODED_ABSOLUTE_FILENAME">DMI: ハードコード された絶対パス名への参照がある</a></td><td>Dodgy code</td></tr>
420 <tr bgcolor="#ffffff"><td><a href="#DMI_NONSERIALIZABLE_OBJECT_WRITTEN">DMI: Obj ectOutput に書き込まれる非直列化可能オブジェクト</a></td><td>Dodgy code</td></tr>
421 <tr bgcolor="#eeeeee"><td><a href="#DMI_USELESS_SUBSTRING">DMI: substring(0) の呼び 出しは元の値を返す</a></td><td>Dodgy code</td></tr>
422 <tr bgcolor="#ffffff"><td><a href="#DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED">D m: Thread オブジェクトが Runnable が期待されているところに渡されている</a></td><td>Dodgy code</td></tr>
423 <tr bgcolor="#eeeeee"><td><a href="#EQ_DOESNT_OVERRIDE_EQUALS">Eq: スーパークラスの equa ls メソッドをオーバーライドしていないクラス</a></td><td>Dodgy code</td></tr>
424 <tr bgcolor="#ffffff"><td><a href="#EQ_UNUSUAL">Eq: 異常な equals メソッド </a></td><td >Dodgy code</td></tr>
425 <tr bgcolor="#eeeeee"><td><a href="#FE_FLOATING_POINT_EQUALITY">FE: 浮動小数点の等価性のため のテスト</a></td><td>Dodgy code</td></tr>
426 <tr bgcolor="#ffffff"><td><a href="#VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN"> FS: Boolean 型でない引数を %b 書式指示子を使用してフォーマットしている</a></td><td>Dodgy code</td></tr>
427 <tr bgcolor="#eeeeee"><td><a href="#IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTE R_METHOD">IA: 潜在的な継承されたメソッドなのか外部のメソッドなのかあいまいなメソッドの呼び出し</a></td><td>Dodgy code</t d></tr>
428 <tr bgcolor="#ffffff"><td><a href="#IC_INIT_CIRCULARITY">IC: 初期化が循環している</a></td> <td>Dodgy code</td></tr>
429 <tr bgcolor="#eeeeee"><td><a href="#ICAST_IDIV_CAST_TO_DOUBLE">ICAST: 整数の除算の結果を double または float にキャストしている</a></td><td>Dodgy code</td></tr>
430 <tr bgcolor="#ffffff"><td><a href="#ICAST_INTEGER_MULTIPLY_CAST_TO_LONG">ICAST: 整数乗算の結果を long にキャストしている</a></td><td>Dodgy code</td></tr>
431 <tr bgcolor="#eeeeee"><td><a href="#IM_AVERAGE_COMPUTATION_COULD_OVERFLOW">IM: 平 均の計算はオーバーフローする可能性がある</a></td><td>Dodgy code</td></tr>
432 <tr bgcolor="#ffffff"><td><a href="#IM_BAD_CHECK_FOR_ODD">IM: 負数で機能しない奇数チェック</a> </td><td>Dodgy code</td></tr>
433 <tr bgcolor="#eeeeee"><td><a href="#INT_BAD_REM_BY_1">INT: 1を法とする整数の剰余</a></td>< td>Dodgy code</td></tr>
434 <tr bgcolor="#ffffff"><td><a href="#INT_VACUOUS_BIT_OPERATION">INT: 整数値の無意味なビットマ スク演算</a></td><td>Dodgy code</td></tr>
435 <tr bgcolor="#eeeeee"><td><a href="#INT_VACUOUS_COMPARISON">INT: 整数値の無意味な比較</a>< /td><td>Dodgy code</td></tr>
436 <tr bgcolor="#ffffff"><td><a href="#MTIA_SUSPECT_SERVLET_INSTANCE_FIELD">MTIA: S ervlet クラスを拡張したクラスでのインスタンス変数の使用</a></td><td>Dodgy code</td></tr>
437 <tr bgcolor="#eeeeee"><td><a href="#MTIA_SUSPECT_STRUTS_INSTANCE_FIELD">MTIA: St ruts Action を拡張したクラスでのインスタンス変数の使用</a></td><td>Dodgy code</td></tr>
438 <tr bgcolor="#ffffff"><td><a href="#NP_DEREFERENCE_OF_READLINE_VALUE">NP: readLi ne メソッドの結果が null なのか確かめないで値を利用している</a></td><td>Dodgy code</td></tr>
439 <tr bgcolor="#eeeeee"><td><a href="#NP_IMMEDIATE_DEREFERENCE_OF_READLINE">NP: re adLine メソッドの結果をすぐに利用している</a></td><td>Dodgy code</td></tr>
440 <tr bgcolor="#ffffff"><td><a href="#NP_LOAD_OF_KNOWN_NULL_VALUE">NP: null とわかってい る値のロード</a></td><td>Dodgy code</td></tr>
441 <tr bgcolor="#eeeeee"><td><a href="#NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION">NP: メソッドはパラメータに nullness アノテーションを強化している</a></td><td>Dodgy code</td></tr>
442 <tr bgcolor="#ffffff"><td><a href="#NP_METHOD_RETURN_RELAXING_ANNOTATION">NP: メソ ッドは戻り値の nullness アノテーションを緩和している</a></td><td>Dodgy code</td></tr>
443 <tr bgcolor="#eeeeee"><td><a href="#NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE">NP: null になっている可能性があるメソッドの戻り値を利用している</a></td><td>Dodgy code</td></tr>
444 <tr bgcolor="#ffffff"><td><a href="#NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE">NP : null 値を実行不可能かもしれない分岐で利用している可能性がある</a></td><td>Dodgy code</td></tr>
445 <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>
446 <tr bgcolor="#ffffff"><td><a href="#NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD">NP: 書き込まれていない public または protected フィールドの読み出し</a></td><td>Dodgy code</td></tr>
447 <tr bgcolor="#eeeeee"><td><a href="#NS_DANGEROUS_NON_SHORT_CIRCUIT">NS: 潜在的な非短絡論 理の危険な使用</a></td><td>Dodgy code</td></tr>
448 <tr bgcolor="#ffffff"><td><a href="#NS_NON_SHORT_CIRCUIT">NS: 非短絡論理の疑わしい使用</a></ td><td>Dodgy code</td></tr>
449 <tr bgcolor="#eeeeee"><td><a href="#PZLA_PREFER_ZERO_LENGTH_ARRAYS">PZLA: null で はなく長さが0の配列を返すことを検討する</a></td><td>Dodgy code</td></tr>
450 <tr bgcolor="#ffffff"><td><a href="#QF_QUESTIONABLE_FOR_LOOP">QF: 複雑か巧妙か間違ったインクリ メントの for ループ</a></td><td>Dodgy code</td></tr>
451 <tr bgcolor="#eeeeee"><td><a href="#RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL _VALUE">RCN: 非 null 値と null 値との冗長な比較</a></td><td>Dodgy code</td></tr>
452 <tr bgcolor="#ffffff"><td><a href="#RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES">RC N: 2つの null 値の冗長な比較</a></td><td>Dodgy code</td></tr>
453 <tr bgcolor="#eeeeee"><td><a href="#RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE">RC N: null でないことがわかっている値の冗長な null チェック</a></td><td>Dodgy code</td></tr>
454 <tr bgcolor="#ffffff"><td><a href="#RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE">RCN: null とわかっている値の冗長な null チェック</a></td><td>Dodgy code</td></tr>
455 <tr bgcolor="#eeeeee"><td><a href="#REC_CATCH_EXCEPTION">REC: 例外がスローされないのに例外をキャッ チしている</a></td><td>Dodgy code</td></tr>
456 <tr bgcolor="#ffffff"><td><a href="#RI_REDUNDANT_INTERFACES">RI: スーパークラスと同じインタフェ ースを実装しているクラス</a></td><td>Dodgy code</td></tr>
457 <tr bgcolor="#eeeeee"><td><a href="#RV_CHECK_FOR_POSITIVE_INDEXOF">RV: String.in dexOf の結果が正かどうか確かめている</a></td><td>Dodgy code</td></tr>
458 <tr bgcolor="#ffffff"><td><a href="#RV_DONT_JUST_NULL_CHECK_READLINE">RV: readLi ne メソッドの結果を null でないのか確かめた後で捨てている</a></td><td>Dodgy code</td></tr>
459 <tr bgcolor="#eeeeee"><td><a href="#RV_REM_OF_HASHCODE">RV: ハッシュコードの剰余は負かもしれない</ a></td><td>Dodgy code</td></tr>
460 <tr bgcolor="#ffffff"><td><a href="#RV_REM_OF_RANDOM_INT">RV: 符号付き32ビット整数の乱数の剰余< /a></td><td>Dodgy code</td></tr>
461 <tr bgcolor="#eeeeee"><td><a href="#RV_RETURN_VALUE_IGNORED_INFERRED">RV: メソッドは戻 り値を無視しています、これは間違いではないですか?</a></td><td>Dodgy code</td></tr>
462 <tr bgcolor="#ffffff"><td><a href="#RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT">RV: 副作用がないメソッドの戻り値は無視される</a></td><td>Dodgy code</td></tr>
463 <tr bgcolor="#eeeeee"><td><a href="#SA_FIELD_DOUBLE_ASSIGNMENT">SA: フィールドの二重代入</ a></td><td>Dodgy code</td></tr>
464 <tr bgcolor="#ffffff"><td><a href="#SA_LOCAL_DOUBLE_ASSIGNMENT">SA: ローカル変数の二重代入< /a></td><td>Dodgy code</td></tr>
465 <tr bgcolor="#eeeeee"><td><a href="#SA_LOCAL_SELF_ASSIGNMENT">SA: ローカル変数の自己代入</a ></td><td>Dodgy code</td></tr>
466 <tr bgcolor="#ffffff"><td><a href="#SF_SWITCH_FALLTHROUGH">SF: 1つの case が次の case へと通り抜ける switch 文を発見した</a></td><td>Dodgy code</td></tr>
467 <tr bgcolor="#eeeeee"><td><a href="#SF_SWITCH_NO_DEFAULT">SF: default がない switch 文を発見した</a></td><td>Dodgy code</td></tr>
468 <tr bgcolor="#ffffff"><td><a href="#ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD">ST: インスタンスメソッドから static フィールドへの書き込み</a></td><td>Dodgy code</td></tr>
469 <tr bgcolor="#eeeeee"><td><a href="#SE_PRIVATE_READ_RESOLVE_NOT_INHERITED">Se: サ ブクラスで継承できない private な readResolve メソッド</a></td><td>Dodgy code</td></tr>
470 <tr bgcolor="#ffffff"><td><a href="#SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS" >Se: Serializable でないクラスの transient フィールド</a></td><td>Dodgy code</td></tr>
471 <tr bgcolor="#eeeeee"><td><a href="#TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALW AYS_SINK">TQ: 値は型修飾子を必要としているが、不明としてマークされている</a></td><td>Dodgy code</td></tr>
472 <tr bgcolor="#ffffff"><td><a href="#TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEV ER_SINK">TQ: 値は型修飾子を必要としないが、不明としてマークされている</a></td><td>Dodgy code</td></tr>
473 <tr bgcolor="#eeeeee"><td><a href="#UC_USELESS_CONDITION">UC: 条件は効果がない</a></td>< td>Dodgy code</td></tr>
474 <tr bgcolor="#ffffff"><td><a href="#UC_USELESS_CONDITION_TYPE">UC: 条件は変数型のために効果が ない</a></td><td>Dodgy code</td></tr>
475 <tr bgcolor="#eeeeee"><td><a href="#UC_USELESS_OBJECT">UC: 役に立たないオブジェクトを作成した</a> </td><td>Dodgy code</td></tr>
476 <tr bgcolor="#ffffff"><td><a href="#UC_USELESS_OBJECT_STACK">UC: 役に立たないオブジェクトをスタ ックで作成した</a></td><td>Dodgy code</td></tr>
477 <tr bgcolor="#eeeeee"><td><a href="#UC_USELESS_VOID_METHOD">UC: 役に立たない空ではない void メソッド</a></td><td>Dodgy code</td></tr>
478 <tr bgcolor="#ffffff"><td><a href="#UCF_USELESS_CONTROL_FLOW">UCF: 役に立たない制御フロー</ a></td><td>Dodgy code</td></tr>
479 <tr bgcolor="#eeeeee"><td><a href="#UCF_USELESS_CONTROL_FLOW_NEXT_LINE">UCF: 次の行 へ続くだけの役に立たない制御フロー</a></td><td>Dodgy code</td></tr>
480 <tr bgcolor="#ffffff"><td><a href="#URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD">UrF: 読 み出されない public または protected フィールド</a></td><td>Dodgy code</td></tr>
481 <tr bgcolor="#eeeeee"><td><a href="#UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD">UuF: 未 使用の public または protected フィールド</a></td><td>Dodgy code</td></tr>
482 <tr bgcolor="#ffffff"><td><a href="#UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR">Uw F: コンストラクタで初期化されていないフィールドを null チェックなしで null 値を利用している</a></td><td>Dodgy code</td ></tr>
483 <tr bgcolor="#eeeeee"><td><a href="#UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD">UwF : 書き込まてれいない public または protected フィールド</a></td><td>Dodgy code</td></tr>
484 <tr bgcolor="#ffffff"><td><a href="#XFB_XML_FACTORY_BYPASS">XFB: XMLインタフェースの特定の実 装のインスタンスを作成しているメソッド</a></td><td>Dodgy code</td></tr>
485 </table>
486 <h2>Descriptions</h2>
487 <h3><a name="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS">BC: equals メソッドは引数の型を 仮定するべきではない (BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS)</a></h3>
488
489
490 <p>
491 <code>equals(Object o)</code> メソッドは、<code>o</code> の型についてどんな仮定もするべきではありません。
492 <code>o</code> が <code>this</code> と同じ型でないなら単に false を返すべきです。
493 </p>
494
495
496 <h3><a name="BIT_SIGNED_CHECK">BIT: ビット演算の符号をチェックする (BIT_SIGNED_CHECK)</a></h3>
497
498
499 <p>
500 このメソッドは、<code>((event.detail &amp; SWT.SELECTED) &gt; 0)</code> のような式を比較しています。
501 ビット演算をより大きい演算子で比較することは、予想外の結果 (もちろん、<code>SWT.SELECTED</code> の値による) の原因になる可能性があ ります。
502 <code>SWT.SELECTED</code> が負数であるなら、これはバグの候補です。
503 <code>SWT.SELECTED</code> が負ではないとしても、'&gt; 0' の代わりに '!= 0' を使用することは良いプラクティスと思われま す。
504 </p>
505 <p>
506 Boris Bokowski
507 </p>
508
509
510 <h3><a name="CN_IDIOM">CN: Cloneable を実装したクラスが clone メソッドを定義していないか、使用していない (CN_I DIOM)</a></h3>
511
512
513 <p>
514 このクラスは、<code>Cloneable</code> を実装していますが、<code>clone</code> メソッドを定義していないか使用していません 。
515 </p>
516
517
518 <h3><a name="CN_IDIOM_NO_SUPER_CALL">CN: clone メソッドが super.clone() を呼び出していない (CN _IDIOM_NO_SUPER_CALL)</a></h3>
519
520
521 <p>
522 この非 final クラスは、<code>super.clone()</code> を呼び出さない <code>clone</code> メソッドを定義していま す。
523 クラス <i>A</i> がサブクラス <i>B</i> によって拡張され、サブクラス <i>B</i> が <code>super.clone()</code > を呼び出すなら、クラス <i>B</i> の <code>clone</code> メソッドは、型 <i>A</i> のオブジェクトを返す可能性が高いです。
524 これは <code>clone</code> のための汎用規約に違反します。
525 </p>
526 <p>
527 すべての <code>clone</code> メソッドが <code>super.clone()</code> を呼び出すなら <code>Object.cl one()</code> が呼び出されることが保証され、常に正しい型のオブジェクトが返されます。
528 </p>
529
530
531 <h3><a name="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE">CN: Cloneable を実装していないクラスが c lone メソッドを定義している (CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE)</a></h3>
532
533
534 <p>
535 このクラスは、<code>Cloneable</code> を実装していないのに <code>clone</code> メソッドを定義しています。
536 これが OK (たとえば、サブクラスのクローンの実装を自分自身で制御したい場合です) という状況もありますが意図したことなのか確認してください。
537 </p>
538
539
540 <h3><a name="CNT_ROUGH_CONSTANT_VALUE">CNT: 既知の定数の雑な値を見つける (CNT_ROUGH_CONSTANT_V ALUE)</a></h3>
541
542
543 <p>
544 コードの明確さともっと良い正確さのために定義済みライブラリ定数を使用することを推奨します。
545 </p>
546
547
548 <h3><a name="CO_ABSTRACT_SELF">Co: 抽象クラスは共変な compareTo メソッドを定義している (CO_ABSTRACT_ SELF)</a></h3>
549
550
551 <p>
552 このクラスは、共変な <code>compareTo</code> メソッドを定義しています。
553 <code>Comparable</code> インタフェースの <code>compareTo</code> メソッドを正しく実装するためには <code>c ompareTo</code> メソッドのパラメータの型は、<code>java.lang.Object</code> でなければなりません。
554 </p>
555
556
557 <h3><a name="CO_COMPARETO_INCORRECT_FLOATING">Co: compareTo()/compare() は間違って fl oat または double 値を処理する (CO_COMPARETO_INCORRECT_FLOATING)</a></h3>
558
559
560 <p>
561 このメソッドはこのようなパターンを使用して double または float 値を比較しています : val1 &gt; val2 ? 1 : val1 &lt ; val2 ? -1 : 0。
562 このパターンは 正しくないソート結果や壊れたコレクションの原因になるかもしれない -0.0 や NaN 値のために間違って働きます (もし比較された値がキーと して使われるなら)。
563 すべての特殊なケースを正確に処理するために Double.compare または Float.compare メソッドの使用を検討してください。
564 </p>
565
566
567 <h3><a name="CO_COMPARETO_RESULTS_MIN_VALUE">Co: compareTo()/compare() は Integer .MIN_VALUE を返す (CO_COMPARETO_RESULTS_MIN_VALUE)</a></h3>
568
569
570 <p>
571 いくつかの状況下では、この <code>compareTo</code> または <code>compare</code> メソッドは Integer.MIN_ VALUE を返します。ひどいバッドプラクティスです。
572 <code>compareTo</code> メソッドの戻り値で重要なことは結果の符号だけです。
573 しかし、結果の符号を無効にすることを期待して、<code>compareTo</code> メソッドの戻り値を無効にすることがあります。
574 返された値が Integer.MIN_VALUE の場合を除いてです。 Integer.MIN_VALUE よりも-1を返してください。
575 </p>
576
577
578 <h3><a name="CO_SELF_NO_OBJECT">Co: 共変な compareTo メソッドの定義 (CO_SELF_NO_OBJECT)</a ></h3>
579
580
581 <p>
582 このクラスは、共変な <code>compareTo</code> メソッドを定義しています。
583 <code>Comparable</code> インタフェースの <code>compareTo</code> メソッドを正しく実装するためには <code>c ompareTo</code> メソッドのパラメータの型は、<code>java.lang.Object</code> でなければなりません。
584 </p>
585
586
587 <h3><a name="DE_MIGHT_DROP">DE: 例外を捨てているかもしれないメソッド (DE_MIGHT_DROP)</a></h3>
588
589
590 <p>
591 このメソッドは、例外を捨てているかもしれません。
592 一般的にキャッチした例外は何らかの方法で処理、または報告するべきです、またはメソッドからスローするべきです。
593 </p>
594
595
596 <h3><a name="DE_MIGHT_IGNORE">DE: 例外を無視しているかもしれないメソッド (DE_MIGHT_IGNORE)</a></h3>
597
598
599 <p>
600 このメソッドは例外を無視しているかもしれません。
601 一般的に例外は何らかの方法で処理、または報告するべきです、またはメソッドからスローするべきです。
602 </p>
603
604
605 <h3><a name="DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS">DMI: エントリセットの要素を加えることは、Entr y オブジェクトの再利用のために失敗するかもしれない (DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS)</a></h3>
606
607
608 <p>
609 entrySet メソッドは、一つの Entry オブジェクトを再利用し、反復中に返される基底 Map のビューを返すことが許可されています。
610 Java 1.6 の時点で、IdentityHashMap と EnumMap の両方がそうしました。
611 そのような Map を通して繰り返すとき、エントリ値は次の繰り返しへ進むまでが有効です。
612 たとえば、addAll メソッドにそのような entrySet を渡そうと試みるのは、ひどく間違っているでしょう。
613 </p>
614
615
616 <h3><a name="DMI_RANDOM_USED_ONLY_ONCE">DMI: Random オブジェクトが作成され1度しか使われない (DMI_RA NDOM_USED_ONLY_ONCE)</a></h3>
617
618
619 <p>
620 このコードは、<code>java.util.Random</code> オブジェクトを作成して1つの乱数を生成するために使用して捨てています。
621 これはあまり良くない品質の乱数を作り出し、効率が悪いです。
622 できれば、<code>Random</code> オブジェクトを1つだけ作成して保存されるようにコードを書き直してください。
623 そして、毎回新しい乱数は既存の <code>Random</code> オブジェクトを呼び出して取得することが必要です。
624 </p>
625 <p>
626 生成された乱数が推測可能でないことが重要なら、乱数ごとに新しい <code>Random</code> オブジェクトを作成してはいけません (値はあまりに簡単に 推測可能です)。
627 その代わりに <code>java.security.SecureRandom</code> の使用を強く検討するべきです (そして必要とされる乱数ごとに新しい <code>SecureRandom</code> のオブジェクトを作成することを回避します)。
628 </p>
629
630
631 <h3><a name="DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION">DMI: コレクションを消去するために remove All メソッドを使用しない (DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION)</a></h3>
632
633
634 <p>
635 コレクション <code>c</code> からすべての要素を除去したいなら、<code>c.removeAll(c)</code> ではなく <code>c. clear</code> を使用してください。
636 コレクションを消去するために <code>c.removeAll(c)</code> を呼び出すことは、それほど明確ではなく、タイプミスからの誤りに影響されやす く、効率的ではなく、いくつかのコレクションでは、<code>ConcurrentModificationException</code> をスローするかもしれま せん。
637 </p>
638
639
640 <h3><a name="DM_EXIT">Dm: System.exit(...) を呼び出しているメソッド (DM_EXIT)</a></h3>
641
642
643 <p>
644 <code>System.exit(...)</code> を呼び出すことは、Java 仮想マシン全体をシャットダウンさせてしまいます。
645 それが適切な場合にだけ使用するべきです。
646 <code>System.exit(...)</code> の呼び出しは、他のコードによる呼び出しを困難か不可能にします。
647 その代わりに RuntimeException をスローすることを検討してください。
648 </p>
649
650
651 <h3><a name="DM_RUN_FINALIZERS_ON_EXIT">Dm: 危険なメソッド runFinalizersOnExit を呼び出している メソッド (DM_RUN_FINALIZERS_ON_EXIT)</a></h3>
652
653
654 <p>
655 どんな理由があるにせよ決して <code>System.runFinalizersOnExit</code> と <code>Runtime.runFinali zersOnExit</code> を呼び出さないでください。
656 Java ライブラリで最も危険なメソッドの1つです。 -- Joshua Bloch
657 </p>
658
659
660 <h3><a name="ES_COMPARING_PARAMETER_STRING_WITH_EQ">ES: String パラメータを == や != を使 用して比較している (ES_COMPARING_PARAMETER_STRING_WITH_EQ)</a></h3>
661
662
663 <p>
664 このコードは、参照等価性のために == や != を使用して <code>java.lang.String</code> パラメータを比較しています。
665 文字列定数または正準化された文字列だけをメソッドに渡すことを呼び出し元に要求することは必要以上に脆弱で測定可能な性能の向上をもたらしません。
666 その代わりに <code>equals(Object)</code> メソッドを使用することを検討してください。
667 </p>
668
669
670 <h3><a name="ES_COMPARING_STRINGS_WITH_EQ">ES: String オブジェクトを == や != を使用して比較してい る (ES_COMPARING_STRINGS_WITH_EQ)</a></h3>
671
672
673 <p>
674 このコードは、参照等価性のために == や != を使用して <code>java.lang.String</code> オブジェクトを比較しています。
675 両方の文字列がソースファイルの定数か、<code>String.intern()</code> を使用して正準化されていないかぎり、同じ文字列は2つの異なる S tring オブジェクトによって表されるかもしれません。
676 その代わりに <code>equals(Object)</code> メソッドを使用することを検討してください。
677 </p>
678
679
680 <h3><a name="EQ_ABSTRACT_SELF">Eq: 抽象クラスは共変な equals メソッドを宣言している (EQ_ABSTRACT_SEL F)</a></h3>
681
682
683 <p>
684 このクラスは、共変な <code>equals</code> メソッドを定義しています。
685 <code>java.lang.Object</code> の <code>equals</code> メソッドを正しくオーバーライドするためには <code> equals</code> メソッドのパラメータの型は、<code>java.lang.Object</code> でなければなりません。
686 </p>
687
688
689 <h3><a name="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS">Eq: equals メソッドは互換性の ないオペランドをチェックしている (EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS)</a></h3>
690
691
692 <p>
693 この <code>equals</code> メソッドは、引数が互換性のない型 (すなわちスーパタイプでもなく、<code>equals</code> メソッド を定義しているクラスのスーパータイプでもサブタイプでもないクラス) なのか確かめています。
694 たとえば、<code>Foo</code> クラスの <code>equals</code> メソッドはそのように見えるかもしれません。
695 </p>
696 <blockquote><pre>
697 public boolean equals(Object o) {
698 if (o instanceof Foo)
699 return name.equals(((Foo)o).name);
700 else if (o instanceof String)
701 return name.equals(o);
702 else return false;
703 }
704 </pre></blockquote>
705 <p>
706 これは対称的で推移的である <code>equals</code> メソッドを実現するのはとても難しいので、バッドプラクティスと見なされています。
707 プロパティがなければまったく予想していない振る舞いが起こりえます。
708 </p>
709
710
711 <h3><a name="EQ_COMPARETO_USE_OBJECT_EQUALS">Eq: compareTo(...) メソッドを定義して Object .equals() を使用しているクラス (EQ_COMPARETO_USE_OBJECT_EQUALS)</a></h3>
712
713
714 <p>
715 このクラスは、<code>compareTo(...)</code> メソッドを定義していますが、<code>equals</code> メソッドは <code >java.lang.Object</code> から継承しています。
716 一般的に<code>equals</code> メソッドが true を返す場合に限り、<code>compareTo</code> メソッドは0を返すべきです 。
717 これが違反されるなら奇妙で予測できない失敗が PriorityQueue などのクラスで発生します。
718 J2SE 5.0では、<code>PriorityQueue.remove()</code> は <code>compareTo</code> メソッドを使用し ますが、Java SE 6では、<code>equals</code> メソッドを使用します。
719 </p>
720 <p>
721 Comparable インタフェースの compareTo メソッドの JavaDoc を以下に引用します。
722 </p>
723 <blockquote><p>
724 必須というわけではありませんが、<code>(x.compareTo(y)==0) == (x.equals(y))</code> であることが強く推奨されます 。
725 一般的に<code>Comparable</code> インタフェースを実装しているクラスで、この条件に違反するクラスは明確にこの事実を示す必要があります。
726 「注:このクラスは <code>equals</code> と一貫性のない自然順序付けを持ちます」などと明示することをお勧めします。
727 </blockquote></p>
728
729
730 <h3><a name="EQ_GETCLASS_AND_CLASS_CONSTANT">Eq: equals メソッドはサブタイプのために失敗する (EQ_G ETCLASS_AND_CLASS_CONSTANT)</a></h3>
731
732
733 <p>
734 このクラスは、サブクラスによる継承によって壊れる <code>equlas</code> メソッドがあります。
735 <code>equals</code> メソッドは、クラスリテラルを引数のクラスと比較しています (たとえば、<code>Foo</code> クラスで <co de>Foo.class == o.getClass()</code> のような判定を行っています)。
736 <code>this.getClass() == o.getClass()</code> の方がより良いです。
737 </p>
738
739
740 <h3><a name="EQ_SELF_NO_OBJECT">Eq: 共変な equals メソッドの定義 (EQ_SELF_NO_OBJECT)</a></ h3>
741
742
743 <p>
744 このクラスは、共変な <code>equals</code> メソッドを定義しています。
745 <code>java.lang.Object</code> の <code>equals</code> メソッドを正しくオーバーライドするためには <code> equals</code> メソッドのパラメータの型は、<code>java.lang.Object</code> でなければなりません。
746 </p>
747
748
749 <h3><a name="FI_EMPTY">FI: 空のファイナライザは削除するべき (FI_EMPTY)</a></h3>
750
751
752 <p>
753 空の <code>finalize</code> メソッドは役に立たないので削除するべきです。
754 </p>
755
756
757 <h3><a name="FI_EXPLICIT_INVOCATION">FI: ファイナライザの明示的な呼び出し (FI_EXPLICIT_INVOCATIO N)</a></h3>
758
759
760 <p>
761 このメソッドには明示的にオブジェクトで <code>finalize</code> メソッドの呼び出しがあります。
762 ファイナライザは Java 仮想マシンによって1度だけ実行されることになっているので、これは間違った考えです。
763 </p>
764 <p>
765 参照によってつながった複数のオブジェクトがファイナライズ可能になると、Java 仮想マシンはすべてのオブジェクトの <code>finalize</code> メソッドを呼び出します。
766 おそらく異なるスレッドで同時にです。
767 したがって、クラス <i>X</i> の <code>finalize</code> メソッドの中から <i>X</i> によって参照されているオブジェクトの <code>finalize</code> メソッドを呼び出すのは、とりわけ間違った考えです。
768 なぜなら、オブジェクトが既に別のスレッドによってファイナライズされているかもしれないからです。
769 </p>
770
771
772 <h3><a name="FI_FINALIZER_NULLS_FIELDS">FI: ファイナライザはフィールドを null にする (FI_FINALIZE R_NULLS_FIELDS)</a></h3>
773
774
775 <p>
776 このファイナライザは、フィールドを null にしています。
777 これは通常誤りでガベージコレクタを助けません。オブジェクトはいずれにしろガベージされます。
778 </p>
779
780
781 <h3><a name="FI_FINALIZER_ONLY_NULLS_FIELDS">FI: ファイナライザはフィールドを null にするだけ (FI_F INALIZER_ONLY_NULLS_FIELDS)</a></h3>
782
783
784 <p>
785 このファイナライザは、フィールドを null にすること以外に何もしません。
786 これはまったく無意味であり、オブジェクトがガベージされ、ファイナライズされ、再びガベージされることを要求しています。
787 <code>finalize</code> メソッドを除去するべきです。
788 </p>
789
790
791 <h3><a name="FI_MISSING_SUPER_CALL">FI: ファイナライザはスーパークラスのファイナライザを呼び出していない (FI_MIS SING_SUPER_CALL)</a></h3>
792
793
794 <p>
795 この <code>finalize</code> メソッドは、スーパークラスの <code>finalize</code> メソッドを呼び出していません。
796 したがって、スーパークラスのために定義されたどんなファイナライザアクションも実行されません。
797 <code>super.finalize()</code> の呼び出しを追加してください。
798 </p>
799
800
801 <h3><a name="FI_NULLIFY_SUPER">FI: ファイナライザはスーパークラスのファイナライザを無効にしている (FI_NULLIFY_S UPER)</a></h3>
802
803
804 <p>
805 この空の <code>finalize</code> メソッドは、明示的にスーパークラスによって定義されたどんなファイナライザの効果も無効にします。
806 スーパークラスのために定義されたどんなファイナライザアクションも実行されません。
807 これが意図したことではない場合、メソッドを削除してください。
808 </p>
809
810
811 <h3><a name="FI_USELESS">FI: ファイナライザはスーパークラスのファイナライザを呼び出しているだけ (FI_USELESS)</a>< /h3>
812
813
814 <p>
815 この <code>finalize</code> メソッドは、スーパークラスの <code>finalize</code> メソッドを呼び出しているだけです。
816 冗長なので削除してください。
817 </p>
818
819
820 <h3><a name="VA_FORMAT_STRING_USES_NEWLINE">FS: 書式文字列は \n よりも %n を使用するべき (VA_FOR MAT_STRING_USES_NEWLINE)</a></h3>
821
822
823 <p>
824 この書式文字列には改行文字 (\n) が含まれています。
825 一般的に書式文字列には %n を使用することがより望ましいです。%n は、プラットホーム特有の行セパレータを作り出します。
826 </p>
827
828
829 <h3><a name="GC_UNCHECKED_TYPE_IN_GENERIC_CALL">GC: 検査されない型への総称呼び出し (GC_UNCHECKE D_TYPE_IN_GENERIC_CALL)</a></h3>
830
831
832 <p>
833 総称型パラメータからの特定の型が予想される Object 型をコンパイルするとき、総称型コレクションメソッドへの呼び出しは引数を渡します。
834 したがって、標準の Java 型システムも静的解析もパラメータとして渡されているオブジェクトが適切な型かどうかに関する有用な情報を提供できません。
835 </p>
836
837
838 <h3><a name="HE_EQUALS_NO_HASHCODE">HE: equals メソッドは定義していますが hashCode メソッドは定義してい ないクラス (HE_EQUALS_NO_HASHCODE)</a></h3>
839
840
841 <p>
842 このクラスは、<code>equals(Object)</code> メソッドをオーバーライドしていますが、<code>hashCode</code> メソッド はオーバーライドしていません。
843 したがって、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に違反するかも しれません。
844 </p>
845
846
847 <h3><a name="HE_EQUALS_USE_HASHCODE">HE: equals メソッドを定義して Object.hashCode() を使用し ているクラス (HE_EQUALS_USE_HASHCODE)</a></h3>
848
849
850 <p>
851 このクラスは、<code>equals(Object)</code> をオーバーライドしていますが、<code>hashCode</code> メソッドは <c ode>java.lang.Object</code> から継承しています (同一性ハッシュコード (Java 仮想マシンによってオブジェクトに代入された任意の 値) を返します)。
852 したがって、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に違反するかも しれません。
853 </p>
854 <p>
855 このクラスのインスタンスが HashMap/HashTable に決して代入されるだろうと思わないなら推奨される <code>hashCode</code> メ ソッドの実装は以下のようになります。
856 </p>
857 <blockquote><pre>
858 public int hashCode() {
859 assert false : "hashCodeが呼び出されることは想定されていません。";
860 return 42; // 適当な値
861 }
862 </pre></blockquote>
863
864
865 <h3><a name="HE_HASHCODE_NO_EQUALS">HE: hashCode メソッドを定義していますが equals メソッドは定義してい ないクラス (HE_HASHCODE_NO_EQUALS)</a></h3>
866
867
868 <p>
869 このクラスは、<code>hashCode</code> メソッドを定義していますが、<code>equals</code> メソッドは定義していません。
870 これは「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に違反するかもしれま せん。
871 </p>
872
873
874 <h3><a name="HE_HASHCODE_USE_OBJECT_EQUALS">HE: hashCode メソッドを定義して Object.equals () を使用しているクラス (HE_HASHCODE_USE_OBJECT_EQUALS)</a></h3>
875
876
877 <p>
878 このクラスは、<code>hashCode</code> メソッドを定義していますが、 <code>equals</code> メソッドは <code>java .lang.Object</code> から継承しています (オブジェクトの参照比較で等価性を判定します)。
879 これは「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に従っているかもしれ ませんが、
880 おそらく、<code>hashCode</code> メソッドをオーバーライドすることによって意図されたことではありません。
881 (<code>hashCode</code> メソッドをオーバーライドすることは、オブジェクトの同一性が単純な参照等価性よりも複雑な規約に基づくことを意味します )。
882 </p>
883 <p>
884 このクラスのインスタンスが HashMap/HashTable に決して代入されるだろうと思わないなら推奨される <code>hashCode</code> メ ソッドの実装は以下のようになります。
885 </p>
886 <blockquote><pre>
887 public int hashCode() {
888 assert false : "hashCodeが呼び出されることは想定されていません。";
889 return 42; // 適当な値
890 }
891 </pre></blockquote>
892
893
894 <h3><a name="HE_INHERITS_EQUALS_USE_HASHCODE">HE: equals メソッドを継承して Object.hashCo de() を使用しているクラス (HE_INHERITS_EQUALS_USE_HASHCODE)</a></h3>
895
896
897 <p>
898 このクラスは、抽象スーパークラスから <code>equals(Object)</code> メソッドを継承して、<code>java.lang.Object< /code> から <code>hashCode</code> メソッドを継承しています (同一性ハッシュコード (Java 仮想マシンによってオブジェクトに代 入された任意の値) を返します)。
899 したがって、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に違反するかも しれません。
900 </p>
901 <p>
902 <code>hashCode</code> メソッドを定義したくないまたはオブジェクトが HashMap/Hashtable に決して格納されないだろうと思って いるなら <code>UnsupportedOperationException</code> をスローする <code>hashCode()</code> メ ソッドを定義してください。
903 </p>
904
905
906 <h3><a name="IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION">IC: スーパークラスは初期化中 にサブクラスを使用している (IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION)</a></h3>
907
908
909 <p>
910 クラスは、初期化中にサブクラスを積極的に使用しています。サブクラスはこの時点ではまだ初期化されていません。<br>
911 たとえば、以下のコードにおいて、<code>foo</code> は null です。
912 </p>
913 <blockquote><pre>
914 public class CircularClassInitialization {
915 static class InnerClassSingleton extends CircularClassInitialization {
916 static InnerClassSingleton singleton = new InnerClassSingleton();
917 }
918
919 static CircularClassInitialization foo = InnerClassSingleton.singleton;
920 }
921 </pre></blockquote>
922
923
924 <h3><a name="IMSE_DONT_CATCH_IMSE">IMSE: 疑わしい IllegalMonitorStateException のキャッチ (IMSE_DONT_CATCH_IMSE)</a></h3>
925
926
927 <p>
928 <code>IllegalMonitorStateException</code> は、一般的に設計上の欠陥 (ロックを保持していないオブジェクトで <code >wait</code> メソッドまたは <code>notify</code> メソッドを呼び出す) の場合にだけスローされます。
929 </p>
930
931
932 <h3><a name="ISC_INSTANTIATE_STATIC_CLASS">ISC: static メソッドだけを提供するクラスの不必要なインスタンス 化 (ISC_INSTANTIATE_STATIC_CLASS)</a></h3>
933
934
935 <p>
936 このクラスは、static メソッドだけを提供するクラスのオブジェクトを作成しています。
937 このオブジェクトは作成する必要はありません。修飾子として直接クラス名を使用する static メソッドにアクセスしてください。
938 </p>
939
940
941 <h3><a name="IT_NO_SUCH_ELEMENT">It: Iterator.next() が NoSuchElementException をス ローできない (IT_NO_SUCH_ELEMENT)</a></h3>
942
943
944 <p>
945 このクラスは、<code>java.util.Iterator</code> を実装しています。
946 しかしながら、<code>next</code> メソッドは <code>java.util.NoSuchElementException</code> をスロ ーできません。
947 <code>next</code> メソッドは、それ以上要素を返すことができないときは <code>NoSuchElementException</code> をスローするように変更するべきです。
948 </p>
949
950
951 <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>
952
953
954 <p>
955 このコードは、HttpSession に非直列化可能オブジェクトを格納していると思われます。
956 このセッションが不活性化されるか移行したなら、エラーを招きます。
957 </p>
958
959
960 <h3><a name="JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS">JCIP: 不変クラスのフィールドは final にすべき (JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS)</a></h3>
961
962
963 <p>
964 クラスは、net.jcip.annotations.Immutable または javax.annotation.concurrent.Immutable でア ノテートされています。
965 アノテーションのルールは、すべてのフィールドが final であることを義務づけます。
966 </p>
967
968
969 <h3><a name="ME_ENUM_FIELD_SETTER">ME: public 列挙型メソッドが無条件にフィールドを設定するPublic enum method unconditionally sets its field (ME_ENUM_FIELD_SETTER)</a></h3>
970
971
972 <p>
973 無条件に列挙型フィールドを設定している public 列挙型で public メソッドを宣言しています。
974 したがって、フィールドは悪意のあるコードや偶然別のパッケージによって変更できます。
975 可変列挙型フィールドが遅延初期化で使用されるかもしれないとしても外界へ暴露するバッドプラクティスです。
976 このメソッドを除去するかパッケージプライベートとして宣言することを考えてください。
977 </p>
978
979
980 <h3><a name="ME_MUTABLE_ENUM_FIELD">ME: 列挙型フィールドは public で可変である (ME_MUTABLE_ENUM _FIELD)</a></h3>
981
982
983 <p>
984 可変 public フィールドが public 列挙型の中に定義されています。
985 したがって、フィールドは悪意のあるコードや偶然別のパッケージによって変更できます。
986 可変列挙型フィールドが遅延初期化で使用されるかもしれないとしても外界へ暴露するバッドプラクティスです。
987 このメソッドを final およびパッケージプライベートとして宣言することを考えてください。
988 </p>
989
990
991 <h3><a name="NP_BOOLEAN_RETURN_NULL">NP: 戻り型が Boolean のメソッドが明示的に null を返している (NP _BOOLEAN_RETURN_NULL)</a></h3>
992
993
994 <p>
995 Boolean.TRUE、Boolean.FALSE、null を返すメソッドはいつ事故が起きてもおかしくないです。
996 このメソッドは、まるで論理型の値を返すかのように呼び出されます。
997 コンパイラは Boolean 値のオートアンボクシングを挿入します。
998 null 値が返されるなら NullPointerException が発生することになります。
999 </p>
1000
1001
1002 <h3><a name="NP_CLONE_COULD_RETURN_NULL">NP: null を返すかもしれない clone メソッド (NP_CLONE _COULD_RETURN_NULL)</a></h3>
1003
1004
1005 <p>
1006 この <code>clone</code> メソッドは、いくつかの条件で null を返すと思われます。
1007 しかし、<code>clone</code> メソッドは決して null を返すのは許されません。
1008 この経路が到達できないことを確信しているなら、代わりに <code>AssertionError</code> をスローしてください。
1009 </p>
1010
1011
1012 <h3><a name="NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT">NP: equals メソッドは null の引数をチェ ックしていない (NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT)</a></h3>
1013
1014
1015 <p>
1016 この <code>equals(Object)</code> メソッドの実装は引数として渡されている null をチェックしていないので、<code>java. lang.Object.equals()</code> で定義された規約に違反しています。
1017 すべての <code>equals</code> メソッドは引数に null が渡されたなら false を返すべきです。
1018 </p>
1019
1020
1021 <h3><a name="NP_TOSTRING_COULD_RETURN_NULL">NP: null を返すかもしれない toString メソッド (NP _TOSTRING_COULD_RETURN_NULL)</a></h3>
1022
1023
1024 <p>
1025 この <code>toString</code> メソッドは、いくつかの条件で null を返すと思われます。
1026 仕様を寛大に読むとこれが許されると解釈できるかもしれませんが、それはおそらく間違った考えで、他のコードが壊れる原因になる可能性があります。
1027 null ではなく空の文字列または、いくつかの他の適切な文字列を返してください。
1028 </p>
1029
1030
1031 <h3><a name="NM_CLASS_NAMING_CONVENTION">Nm: クラス名は大文字から始めるべき (NM_CLASS_NAMING_CO NVENTION)</a></h3>
1032
1033
1034 <p>
1035 クラス名は、最初の文字とそれに続く各単語の最初の文字を大文字にした名詞にすべきです。
1036 クラス名は単純でわかりやすいようにしてください。
1037 頭文字や略語 (URLやHTMLなどのように略語がロング形式よりもはるかに広く使われている場合を除く) の使用は避けてください。
1038 </p>
1039
1040
1041 <h3><a name="NM_CLASS_NOT_EXCEPTION">Nm: 例外クラスのように命名されているが、クラスは Exception から派生され ていない (NM_CLASS_NOT_EXCEPTION)</a></h3>
1042
1043
1044 <p>
1045 このクラスは、例外クラスから派生されていないのにクラス名が「Exception」で終わっています。
1046 これはこのクラスのユーザに紛らわしいです。
1047 </p>
1048
1049
1050 <h3><a name="NM_CONFUSING">Nm: 紛らわしい名前のメソッド (NM_CONFUSING)</a></h3>
1051
1052
1053 <p>
1054 参照されたメソッドは、大文字の使い方だけによって異なる名前があります。
1055 </p>
1056
1057
1058 <h3><a name="NM_FIELD_NAMING_CONVENTION">Nm: フィールド名は小文字から始めるべき (NM_FIELD_NAMING_ CONVENTION)</a></h3>
1059
1060
1061 <p>
1062 final でないフィールドの名前は、最初の文字は小文字にし、それに続く各単語の最初の文字を大文字にすべきです。
1063 </p>
1064
1065
1066 <h3><a name="NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER">Nm: Java の後のバージョンのキーワードである識別子 を使用している (NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER)</a></h3>
1067
1068
1069 <p>
1070 識別子は、Java の後のバージョンのキーワードとして予約されている単語です。
1071 コードを Java の後のバージョンでコンパイルするためには変更する必要があります。
1072 </p>
1073
1074
1075 <h3><a name="NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER">Nm: Java の後のバージョンのキーワー ドである識別子を使用している (NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER)</a></h3>
1076
1077
1078 <p>
1079 この識別子は、Java の後のバージョンのキーワードとして使われます。
1080 このコードと API を参照するどんなコードも、Java の後のバージョンでコンパイルするためには変更する必要があります。
1081 </p>
1082
1083
1084 <h3><a name="NM_METHOD_NAMING_CONVENTION">Nm: メソッド名は小文字から始めるべきです (NM_METHOD_NAMI NG_CONVENTION)</a></h3>
1085
1086
1087 <p>
1088 メソッド名は、最初の文字は小文字にし、それに続く各単語の最初の文字を大文字にした動詞にすべきです。
1089 </p>
1090
1091
1092 <h3><a name="NM_SAME_SIMPLE_NAME_AS_INTERFACE">Nm: クラス名は実装されたインタフェースの単純名を遮るべきではな い (NM_SAME_SIMPLE_NAME_AS_INTERFACE)</a></h3>
1093
1094
1095 <p>
1096 このクラスまたはインタフェースは、インタフェースが異なるパッケージであるということを除いて実装された/拡張されたインタフェースと同一の単純名です (たとえば、< code>alpha.Foo</code> が <code>beta.Foo</code> を継承しているような状況です)。
1097 これは非常に紛らわしく、参照関係を解決するために import 文を見なければならなかったり、スーパークラスのメソッドをオーバーライドしないで誤ってメソッドを定 義する状況を作り出します。
1098 </p>
1099
1100
1101 <h3><a name="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS">Nm: クラス名はスーパークラスの単純名を遮るべきではない (N M_SAME_SIMPLE_NAME_AS_SUPERCLASS)</a></h3>
1102
1103
1104 <p>
1105 このクラスは、スーパークラスが異なるパッケージであるということを除いて、スーパークラスと同一の単純名をです (たとえば、<code>alpha.Foo</cod e> が <code>beta.Foo</code> を拡張します)。
1106 これは非常に紛らわしく、参照関係を解決するために import 文を見なければならなかったり、スーパークラスのメソッドをオーバーライドしないで誤ってメソッドを定 義する状況を作り出します。
1107 </p>
1108
1109
1110 <h3><a name="NM_VERY_CONFUSING_INTENTIONAL">Nm: 非常に紛らわしい名前のメソッド (多分意図的) (NM_VERY _CONFUSING_INTENTIONAL)</a></h3>
1111
1112
1113 <p>
1114 参照されたメソッドは、大文字の使い方だけによって異なる名前があります。
1115 大文字の使い方が同一ならメソッドの1つが他のメソッドをオーバーライドするので、非常に紛らわしいです。
1116 他のメソッドの存在から、これらのメソッドの両方の存在が意図的で、確実に混乱させていると思われます。
1117 APIの凍結によって両方とも持たざるを得ない場合を除き、それらのうちの1つを除去しようと努力するべきです。
1118 </p>
1119
1120
1121 <h3><a name="NM_WRONG_PACKAGE_INTENTIONAL">Nm: パラメータの間違ったパッケージのためにスーパークラスのメソッドをオ ーバーライドしていないメソッド (NM_WRONG_PACKAGE_INTENTIONAL)</a></h3>
1122
1123
1124 <p>
1125 パラメータの型が正確にスーパークラスで対応するパラメータの型と合致していないので、サブクラスのメソッドはスーパークラスの類似したメソッドをオーバーライドしていま せん。<br>
1126 たとえば以下のようなコードです。
1127 </p>
1128 <blockquote><pre>
1129 import alpha.Foo;
1130
1131 public class A {
1132 public int f(Foo x) { return 17; }
1133 }
1134 ----
1135 import beta.Foo;
1136
1137 public class B extends A {
1138 public int f(Foo x) { return 42; }
1139 public int f(alpha.Foo x) { return 27; }
1140 }
1141 </pre></blockquote>
1142 <p>
1143 クラス <code>B</code> で定義された <code>f(Foo)</code> メソッドは、クラス <code>A</code> の <code>f (Foo)</code> メソッドをオーバーライドしません。
1144 これは引数の型 <code>Foo</code> が違うパッケージだからです。
1145 </p>
1146 <p>
1147 この場合、サブクラスがスーパークラスのメソッドと同一のシグネチャでメソッドを定義しているので、おそらく理解できます。
1148 しかしながら、そのようなメソッドは非常に紛らわしいです。
1149 類似しているが同一ではないシグネチャのメソッドを除去するか、非推奨にすることを強く検討するべきです。
1150 </p>
1151
1152
1153 <h3><a name="ODR_OPEN_DATABASE_RESOURCE">ODR: データベースリソースのクローズに失敗するかもしれないメソッド (OD R_OPEN_DATABASE_RESOURCE)</a></h3>
1154
1155
1156 <p>
1157 このメソッドは、データベースリソース (たとえば、データベースコネクションや行セット) を作成していますが、どんなフィールドにも代入していないか、他のメソッドに も渡していないか、戻り値にもしていません。
1158 そして、メソッドからのすべての経路でオブジェクトをクローズするように見えません。
1159 メソッドからのすべての経路でデータベースリソースのクローズが失敗すると性能低下になることがあります。
1160 データベースとの通信で問題があるアプリケーションの原因になる可能性があります。
1161 </p>
1162
1163
1164 <h3><a name="ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH">ODR: 例外経路でデータベースリソースのクロー ズに失敗するかもしれないメソッド (ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH)</a></h3>
1165
1166
1167 <p>
1168 このメソッドは、データベースリソース (たとえば、データベースコネクションや行セット) を作成していますが、どんなフィールドにも代入していないか、他のメソッドに も渡していないか、戻り値にもしていません。
1169 そして、メソッドからのすべての例外経路でオブジェクトをクローズするように見えません。
1170 メソッドからのすべての経路でデータベースリソースのクローズが失敗すると性能低下になることがあります。
1171 データベースとの通信で問題があるアプリケーションの原因になる可能性があります。
1172 </p>
1173
1174
1175 <h3><a name="OS_OPEN_STREAM">OS: ストリームのクローズに失敗するかもしれないメソッド (OS_OPEN_STREAM)</a>< /h3>
1176
1177
1178 <p>
1179 このメソッドは、入出力ストリームオブジェクトを作成していますが、どんなフィールドにも代入していないしクローズするかもしれない別のメソッドにも渡していなくて、戻り 値にしてもいません。そして、メソッドからのすべての経路でクローズするように見えません。
1180 これはファイルディスクリプタリークの原因になることがあります。
1181 ストリームがクローズされることを確実にするために <code>finally</code> ブロックを使用することは一般的に良い考えです。
1182 </p>
1183
1184
1185 <h3><a name="OS_OPEN_STREAM_EXCEPTION_PATH">OS: 例外経路でストリームのクローズに失敗するかもしれないメソッド ( OS_OPEN_STREAM_EXCEPTION_PATH)</a></h3>
1186
1187
1188 <p>
1189 このメソッドは、入出力ストリームオブジェクトを作成していますが、どんなフィールドにも代入していないしクローズするかもしれない別のメソッドにも渡していないくて、戻 り値にしてもいません。そして、メソッドからのすべての可能性がある例外経路でクローズするように見えません。
1190 これはファイルディスクリプターリークの原因になることがあります。
1191 ストリームがクローズされることを確実にするために <code>finally</code> ブロックを使用することは一般的に良い考えです。
1192 </p>
1193
1194
1195 <h3><a name="PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS">PZ: 繰り返しでエントリオブジェクトを再利用しな い (PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS)</a></h3>
1196
1197
1198 <p>
1199 このクラスは、Iterator と Map.Entry で基底 Map のビューを返すことを許可された両方の entrySet メソッドがあります。
1200 この巧妙なアイデアは、Map 実装で使用されましたが、厄介なコーディング間違いの可能性を取り込みました。
1201 Map <code>m</code> が entrySet のためのそのような反復子を返すならば、<code>c.addAll(m.entrySet())</c ode> はひどく間違っているでしょう。
1202 OpenJDK 1.7 の すべての Map 実装はこれを回避するために書き直されました。
1203 </p>
1204
1205
1206 <h3><a name="RC_REF_COMPARISON_BAD_PRACTICE">RC: 定数への疑わしい参照比較 (RC_REF_COMPARISON _BAD_PRACTICE)</a></h3>
1207
1208
1209 <p>
1210 このメソッドは、 参照値を == または != 演算子を使用して定数と比較しています。
1211 一般的にこの型のインスタンスを比較する正しい方法は <code>equals</code> メソッドです。
1212 等価で識別可能なインスタンスを作成する可能性がありますが異なるオブジェクトなので == で比較しないでください。
1213 一般的に参照によって比較されるべきではないクラスの例は、<code>java.lang.Integer</code> 、<code>java.lang.Floa t</code> などです。
1214 </p>
1215
1216
1217 <h3><a name="RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN">RC: Boolean 値の疑わしい参照比較 (RC_ REF_COMPARISON_BAD_PRACTICE_BOOLEAN)</a></h3>
1218
1219
1220 <p>
1221 このメソッドは、== または != 演算子を使用して2つの Boolean 値を比較しています。
1222 一般的には2つの Boolean 値 (<code>Boolean.TRUE</code> と <code>Boolean.FALSE</code>) だけです が、
1223 <code>new Boolean(b)</code> コンストラクタを使用して他の Boolean オブジェクトを作成する可能性があります。
1224 そのようなオブジェクトを回避することは最高です。
1225 しかし、それらが存在するなら、Boolean オブジェクトの等価性をチェックするために <code>.equals(...)</code> ではなく == また は != を使用しているなら異なる結果をもたらします。
1226 </p>
1227
1228
1229 <h3><a name="RR_NOT_CHECKED">RR: InputStream.read() の戻り値を無視しているメソッド (RR_NOT_CHEC KED)</a></h3>
1230
1231
1232 <p>
1233 このメソッドは、複数バイトを返す可能性がある <code>java.io.InputStream.read()</code> (またはそのバリエーション) の戻 り値を無視しています。
1234 戻り値がチェックされないと呼び出し元は要求したバイト数よりも少ないバイト数を読み出した場合、正しく処理できません。
1235 これは潜在的なバグで、多くのプログラムでは、入力ストリームからの読み出しは、通常要求した完全なデータ量を読み出しますが、散発的に失敗することがあります。
1236 </p>
1237
1238
1239 <h3><a name="SR_NOT_CHECKED">RR: InputStream.skip() の戻り値を無視しているメソッド (SR_NOT_CHEC KED)</a></h3>
1240
1241
1242 <p>
1243 このメソッドは、複数バイトをスキップする可能性がある <code>java.io.InputStream.skip()</code> の戻り値を無視しています。
1244 戻り値がチェックされないと呼び出し元は要求したバイト数よりも少ないバイト数しかスキップしなかった場合、正しく処理できません。
1245 これは潜在的なバグで、多くのプログラムでは、入力ストリームからのスキップは、通常要求した完全なデータ量をスキップをしますが、散発的に失敗することがあります。
1246 しかしながら、バッファードストリーム での <code>skip</code> メソッドはバッファのデータをスキップするので要求されたバイト数のスキップは常に失 敗します。
1247 </p>
1248
1249
1250 <h3><a name="RV_NEGATING_RESULT_OF_COMPARETO">RV: compareTo()/compare() の結果を無効にす る (RV_NEGATING_RESULT_OF_COMPARETO)</a></h3>
1251
1252
1253 <p>
1254 このコードは、<code>compareTo</code> または <code>compare</code> メソッドの戻り値を無効にしています。
1255 これは疑わしいかバッドプログラミングプラクティスです。戻り値が Integer.MIN_VALUE なので、戻り値を無効にすることは結果の符号を無効にしません。
1256 結果を無効にするのではなくオペランドの順序を逆にすることによって、同じ意図した結果を得ることができます。
1257 </p>
1258
1259
1260 <h3><a name="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE">RV: 例外的戻り値を無視しているメソッド (RV_RET URN_VALUE_IGNORED_BAD_PRACTICE)</a></h3>
1261
1262
1263 <p>
1264 このメソッドはチェックされていない値を返しています。
1265 戻り値は異常か予想外の実行結果を示す可能性があるのでチェックするべきです。
1266 たとえば、<code>File.delete()</code> はファイルをうまく削除できなかったなら、例外をスローするのではなく false を返します。
1267 結果をチェックしないなら例外的戻り値を返すメソッドの呼び出しで予想外の振る舞いの合図に気づきません。
1268 </p>
1269
1270
1271 <h3><a name="SI_INSTANCE_BEFORE_FINALS_ASSIGNED">SI: スタティックイニシャライザは、すべての static final フィールドが代入される前にインスタンスを作成する (SI_INSTANCE_BEFORE_FINALS_ASSIGNED)</a></h3>
1272
1273
1274 <p>
1275 すべての static final フィールドが初期化される前にスタティックイニシャライザがクラスのインスタンスを作成します。
1276 </p>
1277
1278
1279 <h3><a name="SW_SWING_METHODS_INVOKED_IN_SWING_THREAD">SW: Swing メソッドは AWT イベントデ ィスパッチスレッドから呼び出す必要がある (SW_SWING_METHODS_INVOKED_IN_SWING_THREAD)</a></h3>
1280
1281
1282 <p>
1283 (<a href="http://web.archive.org/web/20090526170426/http://java.sun.com/develope r/JDCTechTips/2003/tt1208.html">From JDC Tech Tip</a>)<br>
1284 に解説されているとおり、Swing のメソッド、<code>show</code> メソッド、<code>setVisible</code> メソッド、<cod e>pack</code> メソッドは、フレームのための関連したピアを作成します。
1285 ピアの作成で、システムはイベントディスパッチスレッドを作成します。
1286 これが問題になることがあります。なぜなら <code>pack</code> メソッドと <code>validate</code> メソッドがまだ処理中でもイ ベントディスパッチスレッドがリスナに通知できるからです。
1287 この状況は、2つのスレッドが Swing コンポーネントにアクセスする可能性があり、デッドロックや、その他のスレッドに関する問題になる可能性がある重大な欠陥です 。
1288 <code>pack</code> メソッドの呼び出しはコンポーネントを実体化させます。実体化しているときに、イベントディスパッチスレッドがリスナへの通知を開始 する可能性があります。
1289 </p>
1290
1291
1292 <h3><a name="SE_BAD_FIELD">Se: 直列化可能クラスの非 transient で非直列化可能なインスタンスフィールド (SE_BAD_ FIELD)</a></h3>
1293
1294
1295 <p>
1296 この直列化可能クラスは、transient、Serializable、<code>java.lang.Object</code> でもない非プリミティブ型のイン スタンスフィールドを定義して、
1297 <code>Externalizable</code> インタフェースまたは <code>readObject</code> メソッドと <code>write Object</code> メソッドを実装するように見えません。
1298 また、<code>Externalizable</code> インタフェースも実装していなくて、<code>readObject</code> メソッドも <c ode>writeObject</code> メソッドも定義していません。
1299 非直列化可能オブジェクトがこのフィールドに格納されるならクラスのオブジェクトは正しく直列化復元されません。
1300 </p>
1301
1302
1303 <h3><a name="SE_BAD_FIELD_INNER_CLASS">Se: 非直列化可能クラスに直列化可能な内部クラスがある (SE_BAD_FIEL D_INNER_CLASS)</a></h3>
1304
1305
1306 <p>
1307 この直列化可能クラスは、非直列化可能クラスの内部クラスです。
1308 内部クラスを直列化しようとすると関連する外部クラスのインスタンスを結びつけようとするので、実行時エラーの原因になります。
1309 </p>
1310 <p>
1311 できれば、内部クラスを static にして問題を解決するべきです。
1312 外部クラスを直列化可能にすることで動作するかもしれないが、内部クラスのインスタンスを直列化することは外部クラスも常に直列化することを意味します。
1313 本当に望むことですか。
1314 </p>
1315
1316
1317 <h3><a name="SE_BAD_FIELD_STORE">Se: 非直列化可能な値を直列化可能クラスのインスタンスフィールドに格納している (SE_BA D_FIELD_STORE)</a></h3>
1318
1319
1320 <p>
1321 非直列化可能な値を直列化可能クラスの 非 transient フィールドに格納しています。
1322 </p>
1323
1324
1325 <h3><a name="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE">Se: Comparator は Serializable を実装していない (SE_COMPARATOR_SHOULD_BE_SERIALIZABLE)</a></h3>
1326
1327
1328 <p>
1329 このクラスは <code>Comparator</code> インタフェースを実装しています。
1330 <code>Serializable</code> インタフェースも実装するべきかどうか検討するべきです。
1331 コンパレータが <code>TreeMap</code> のような順序付きコレクションを構築するために使われるなら、コンパレータが直列化可能な場合だけ、<cod e>TreeMap</code> は直列化可能です。
1332 大部分のコンパレータがほとんど状態を持たないとしても直列化可能にすることは簡単で良い防衛的なプログラミングです。
1333 </p>
1334
1335
1336 <h3><a name="SE_INNER_CLASS">Se: 直列化可能な内部クラス (SE_INNER_CLASS)</a></h3>
1337
1338
1339 <p>
1340 この直列化可能なクラスは内部クラスです。内部クラスを直列化しようとすると関連した外部クラスのインスタンスも直列化します。
1341 外部クラスのインスタンスは直列化可能なので失敗しません。しかし、意図していたよりももっと多くのデータを直列化するかもしれません。
1342 できれば、内部クラスを static にして問題を解決するべきです。
1343 </p>
1344
1345
1346 <h3><a name="SE_NONFINAL_SERIALVERSIONID">Se: serialVersionUID が final ではない (SE_ NONFINAL_SERIALVERSIONID)</a></h3>
1347
1348
1349 <p>
1350 このクラスは、final でない <code>serialVersionUID</code> フィールドを定義しています。
1351 直列化を目的としてバージョン UID を指定することを意図しているならフィールドは final とすべきです。
1352 </p>
1353
1354
1355 <h3><a name="SE_NONLONG_SERIALVERSIONID">Se: serialVersionUID が long ではない (SE_NO NLONG_SERIALVERSIONID)</a></h3>
1356
1357
1358 <p>
1359 このクラスは、long でない <code>serialVersionUID</code> フィールドを定義しています。
1360 直列化を目的としてバージョン UID を指定することを意図しているならフィールドは long とすべきです。
1361 </p>
1362
1363
1364 <h3><a name="SE_NONSTATIC_SERIALVERSIONID">Se: serialVersionUID が static ではない (S E_NONSTATIC_SERIALVERSIONID)</a></h3>
1365
1366
1367 <p>
1368 このクラスは、static でない <code>serialVersionUID</code> フィールドを定義しています。
1369 直列化を目的としてバージョン UID を指定することを意図しているならフィールドは static とすべきです。
1370 </p>
1371
1372
1373 <h3><a name="SE_NO_SUITABLE_CONSTRUCTOR">Se: Serializable なクラスのスーパークラスで、引数なしコンスト ラクタを定義していない (SE_NO_SUITABLE_CONSTRUCTOR)</a></h3>
1374
1375
1376 <p>
1377 このクラスは <code>Serializable</code> インタフェースを実装していますが、そのスーパークラスは実装していません。
1378 そのようなオブジェクトが直列化復元されるとき、スーパークラスのフィールドはスーパークラスの引数なしコンストラクタを呼び出すことによって初期化される必要があります 。
1379 スーパークラスには引数なしコンストラクタがないので、直列化と直列化復元は実行時に失敗します。
1380 </p>
1381
1382
1383 <h3><a name="SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION">Se: Externalizable なクラスが引数なしコンストラクタを定義していない (SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION)</a></h 3>
1384
1385
1386 <p>
1387 このクラスは、<code>Externalizable</code> インタフェースを実装していますが、引数なしコンストラクタを定義していません。
1388 <code>Externalizable</code> オブジェクトが直列化復元されるときは、最初に引数なしコンストラクタを呼び出すことによって構築される必要が あります。
1389 このクラスには引数なしコンストラクタがないので、直列化と直列化復元は実行時に失敗します。
1390 </p>
1391
1392
1393 <h3><a name="SE_READ_RESOLVE_MUST_RETURN_OBJECT">Se: readResolve メソッドの戻り値の型が Obj ect で宣言されていない (SE_READ_RESOLVE_MUST_RETURN_OBJECT)</a></h3>
1394
1395
1396 <p>
1397 <code>readResolve</code> メソッドが直列化機構で認識されるためには戻り値の型が <code>Object</code> で宣言されなけれ ばなりません。
1398 </p>
1399
1400
1401 <h3><a name="SE_TRANSIENT_FIELD_NOT_RESTORED">Se: 直列化復元によって設定されない transient フィール ド (SE_TRANSIENT_FIELD_NOT_RESTORED)</a></h3>
1402
1403
1404 <p>
1405 このクラスには複数の場所で更新されるフィールドがあります。したがって、このクラスの状態の一部だと思われます。
1406 しかしながら、フィールドは transient と宣言しているので、 readObject/readResolve で値が設定されません。
1407 クラスの直列化復元されたインスタンスにはデフォルト値が設定されます。
1408 </p>
1409
1410
1411 <h3><a name="SE_NO_SERIALVERSIONID">SnVI: Serializable なクラスが serialVersionUID を定 義していない (SE_NO_SERIALVERSIONID)</a></h3>
1412
1413
1414 <p>
1415 このクラスは <code>Serializable</code> インタフェースを実装していますが、<code>serialVersionUID</code> フィールドを定義していません。
1416 .class オブジェクトへの参照を追加するのと同じくらい簡単な変更でクラスに合成フィールドを追加します。
1417 それは、残念ながら暗黙の <code>serialVersionUID</code> を変えます (たとえば、<code>String.class</code> への参照を追加すると、<code>class$java$lang$String</code> という static フィールドを生成します)。
1418 また、バイトコードコンパイラへの異なるソースコードは、クラスオブジェクトまたは内部クラスを参照するために生成される合成変数のために異なる命名規則を使用するかもし れません。
1419 バージョンを横断する Serializable の相互運用性を保証するために明示的に serialVersionUID を追加することを検討してください。
1420 </p>
1421
1422
1423 <h3><a name="UI_INHERITANCE_UNSAFE_GETRESOURCE">UI: クラスが拡張されるなら getResource の使い方 は安全ではないかもしれない (UI_INHERITANCE_UNSAFE_GETRESOURCE)</a></h3>
1424
1425
1426 <p>
1427 このクラスが別のパッケージによって拡張されるなら、<code>this.getClass().getResource(...)</code> の呼び出しは予想外 の結果をもたらす可能性があります。
1428 </p>
1429
1430
1431 <h3><a name="BC_IMPOSSIBLE_CAST">BC: 不可能なキャスト (BC_IMPOSSIBLE_CAST)</a></h3>
1432
1433
1434 <p>
1435 このキャストは、常に ClassCastException をスローします。
1436 FindBugs は、instanceof チェックから型情報を調査して、メソッドからの戻り値とフィールドからロードされた値の型について、より多くの正確な情報を 使用します。
1437 したがって、宣言された変数の型にはより多くの正確な情報があるかもしれないしれません。
1438 また、キャストが常に実行時例外をスローするのかを決定するために利用する可能性があります。
1439 </p>
1440
1441
1442 <h3><a name="BC_IMPOSSIBLE_DOWNCAST">BC: 不可能なダウンキャスト (BC_IMPOSSIBLE_DOWNCAST)</a ></h3>
1443
1444
1445 <p>
1446 このキャストは、常に ClassCastException をスローします。
1447 解析はキャストしている値の正確な型がわかっていると信じています。
1448 そして、サブタイプへダウンキャストしようとする試みは、ClassCastException のスローによって常に失敗します。
1449 </p>
1450
1451
1452 <h3><a name="BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY">BC: toArray メソッドの結果の不可能なダウンキャスト (BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY)</a></h3>
1453
1454
1455 <p>
1456 このコードは、以下のように、<code>Object[]</code> より特定の型のコレクションで <code>toArray</code> メソッドを呼び出 す結果をキャストしています。
1457 </p>
1458 <blockquote><pre>
1459 String[] getAsArray(Collection&lt;String&gt; c) {
1460 return (String[]) c.toArray();
1461 }
1462 </pre></blockquote>
1463 <p>
1464 これは通常 ClassCastException をスローして失敗します。
1465 ほとんどすべてのコレクションの <code>toArray</code> メソッドは、<code>Object[]</code> を返します。
1466 Collection オブジェクトは宣言された総称型コレクションの参照がないので、本当に何もできません。
1467 コレクションから特定の型の配列を得る正しい方法は、<code>c.toArray(new String[]);</code> または <code>c.toArr ay(new String[c.size()]);</code> (後者はわずかにより効率的です) を使用することです。
1468 これに対する1つの共通の知られている例外があります。
1469 <code>Arrays.asList(...)</code>によって返されるリストの <code>toArray()</code> メソッドは共変型配列を返し ます。
1470 たとえば、<code>Arrays.asArray(new String[] { "a" }).toArray()</code> は <code>String []</code> を返します。
1471 FindBugs はそのようなケースを検出して抑止しようとしますが、見落としているかもしれません。
1472 </p>
1473
1474
1475 <h3><a name="BC_IMPOSSIBLE_INSTANCEOF">BC: 常に false を返す instanceof (BC_IMPOSSIBL E_INSTANCEOF)</a></h3>
1476
1477
1478 <p>
1479 この instanceof は常に false を返します。これは安全で、誤解や論理エラーを指摘していないことを確認してください。
1480 </p>
1481
1482
1483 <h3><a name="BIT_ADD_OF_SIGNED_BYTE">BIT: 符号付きバイト値のビット加算 (BIT_ADD_OF_SIGNED_BYTE )</a></h3>
1484
1485
1486 <p>
1487 バイト値と明らかに下位8ビットがあるとわかっている値を加算しています。
1488 ビット演算を実行する前にバイト配列からロードされた値は32ビットまで符号拡張されます。
1489 したがって、<code>b[0]</code> の値が <code>0xff</code> で、<code>x</code> の初期値が <code>0</co de> だとすると、
1490 <code>((x &lt;&lt; 8) + b[0])</code> は、<code>0xff</code> が符号拡張で <code>0xffffffff </code> になるので、結果として <code>0xffffffff</code> が得られます。
1491 </p>
1492 <p>
1493 特に、バイト配列 int にパックする以下のようなコードはひどく間違っています。
1494 </p>
1495 <blockquote><pre>
1496 int result = 0;
1497 for(int i = 0; i &lt; 4; i++)
1498 result = ((result &lt;&lt; 8) + b[i]);
1499 </pre></blockquote>
1500 <p>
1501 その代わりに以下のようなイディオムは動作します。
1502 </p>
1503 <blockquote><pre>
1504 int result = 0;
1505 for(int i = 0; i &lt; 4; i++)
1506 result = ((result &lt;&lt; 8) + (b[i] &amp; 0xff));
1507 </pre></blockquote>
1508
1509
1510 <h3><a name="BIT_AND">BIT: 互換性のないビットマスク (BIT_AND)</a></h3>
1511
1512
1513 <p>
1514 このメソッドは、<i>(e &amp; C)</i> 形式の式を <i>D</i> と比較しています。
1515 定数 <i>C</i> の特定の値と <i>D</i> ために常に等しくないことを比較します。論理エラーかタイプミスかもしれません。
1516 </p>
1517
1518
1519 <h3><a name="BIT_AND_ZZ">BIT: ((...) & 0) == 0 なのか確かめている (BIT_AND_ZZ)</a></h3>
1520
1521
1522 <p>
1523 このメソッドは、<i>(e &amp; 0)</i> 形式の式を0と比較しています。それは、常に等価であることを比較します。論理エラーかタイプミスかもしれません 。
1524 </p>
1525
1526
1527 <h3><a name="BIT_IOR">BIT: 互換性のないビットマスク (BIT_IOR)</a></h3>
1528
1529
1530 <p>
1531 このメソッドは、<code>(e | C)</code> 形式の式を <code>D</code> と比較しています。
1532 定数 <i>C</i> の特定の値と <i>D</i> のために常に等しくないことを比較します。論理エラーかタイプミスかもしれません。
1533 </p>
1534 <p>
1535 典型的に、このバグは、ビットセットで帰属関係のテストを実行したいコードで発生します。
1536 しかし、ビット論理積演算子 ("&amp;") の代わりにビット論理和演算子 ("|") を使用しています。
1537 </p>
1538
1539
1540 <h3><a name="BIT_IOR_OF_SIGNED_BYTE">BIT: 符号付きバイト値のビット論理和 (BIT_IOR_OF_SIGNED_BYT E)</a></h3>
1541
1542
1543 <p>
1544 ロードしたバイト値 (たとえば、バイト配列からロードされた値や戻り値がバイト型のメソッドから返された値) とビット論理和を実行しています。
1545 ビット演算を実行する前にバイト値は32ビットまで符号拡張されます。
1546 したがって、<code>b[0]</code> の値が <code>0xff</code> で、<code>x</code> の初期値が <code>0</co de> だとすると、
1547 <code>((x &lt;&lt; 8) | b[0])</code> は、<code>0xff</code> が符号拡張で <code>0xffffffff </code> になるので、結果として <code>0xffffffff</code> が得られます。
1548 </p>
1549 <p>
1550 特に、バイト配列 int にパックする以下のようなコードはひどく間違っています。
1551 </p>
1552 <blockquote><pre>
1553 int result = 0;
1554 for(int i = 0; i &lt; 4; i++) {
1555 result = ((result &lt;&lt; 8) | b[i]);
1556 }
1557 </pre></blockquote>
1558 <p>
1559 その代わりに以下のようなイディオムは動作します。
1560 </p>
1561 <blockquote><pre>
1562 int result = 0;
1563 for(int i = 0; i &lt; 4; i++) {
1564 result = ((result &lt;&lt; 8) | (b[i] &amp; 0xff));
1565 }
1566 </pre></blockquote>
1567
1568
1569 <h3><a name="BIT_SIGNED_CHECK_HIGH_BIT">BIT: ビット演算の符号をチェックする (BIT_SIGNED_CHECK_H IGH_BIT)</a></h3>
1570
1571
1572 <p>
1573 このメソッドは、<code>((event.detail &amp; SWT.SELECTED) &gt; 0)</code> のような式を比較しています。
1574 ビット演算をより大きい演算子で比較することは、予想外の結果 (もちろん、<code>SWT.SELECTED</code> の値による) の原因になる可能性があ ります。
1575 <code>SWT.SELECTED</code> が負数であるなら、これはバグの候補です。
1576 <code>SWT.SELECTED</code> が負ではないとしても、'&gt; 0' の代わりに '!= 0' を使用することは良いプラクティスと思われま す。
1577 </p>
1578 <p>
1579 Boris Bokowski
1580 </p>
1581
1582
1583 <h3><a name="BOA_BADLY_OVERRIDDEN_ADAPTER">BOA: スーパークラスの Adapter で実装されるメソッドを誤ってオ ーバーライドしているクラス (BOA_BADLY_OVERRIDDEN_ADAPTER)</a></h3>
1584
1585
1586 <p>
1587 このメソッドは、スーパークラスで実装されているメソッドをオーバーライドしています。
1588 スーパークラスは、java.awt.event や javax.swing.event パッケージで定義されているリスナを実装する Adapter です。
1589 その結果、イベントが発生するときこのメソッドは呼び出されません。
1590 </p>
1591
1592
1593 <h3><a name="BSHIFT_WRONG_ADD_PRIORITY">BSHIFT: シフト演算の正しくない構文解析の可能性がある (BSHIFT_W RONG_ADD_PRIORITY)</a></h3>
1594
1595
1596 <p>
1597 コードは (x &lt;&lt; 8 + y) のような操作を行います。
1598 これは正しいかもしれませんが、おそらく (x &lt;&lt; 8) + y を行うことを意図していました。
1599 しかし、シフト演算は優先順位が低いので、実際には x &lt;&lt; (8 + y) として構文解析されます。
1600 </p>
1601
1602
1603 <h3><a name="ICAST_BAD_SHIFT_AMOUNT">BSHIFT: 32ビット int の-31から31の範囲を超えた量によるシフト (I CAST_BAD_SHIFT_AMOUNT)</a></h3>
1604
1605
1606 <p>
1607 このコードは、32ビット int の-31から31の範囲を超えた量でシフトを実行しています。
1608 これの効果は、どのくらいシフトするのかを決めるために整数値の下位5ビット (32で割った余り) を使用することです (たとえば、40ビットでシフトすることは8ビ ットでシフトすることと同じで、32ビットでシフトすることは0ビットでシフトすることと同じです)。
1609 これはおそらく期待されたことではなく、少なくとも紛らわしいです。
1610 </p>
1611
1612
1613 <h3><a name="DLS_DEAD_LOCAL_INCREMENT_IN_RETURN">DLS: return 文に無駄なインクリメントがある (DL S_DEAD_LOCAL_INCREMENT_IN_RETURN)</a></h3>
1614
1615
1616 <p>
1617 <code>return x++;</code> のような return 文があります。
1618 接頭辞インクリメント/デクリメントは 式の値に影響を与えないので、インクリメント/デクリメントは効果がありません。
1619 この文が正しいのか確かめてください。
1620 </p>
1621
1622
1623 <h3><a name="DLS_DEAD_STORE_OF_CLASS_LITERAL">DLS: クラスリテラルの無効な代入 (DLS_DEAD_STORE _OF_CLASS_LITERAL)</a></h3>
1624
1625
1626 <p>
1627 この命令は変数にクラスリテラルを代入していますが、決して使われません。<br>
1628 <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>
1629 J2SE 1.4 およびそれ以前のバージョンでは、<code>Foo.class</code> への参照は <code>Foo</code> のためのスタティッ クイニシャライザが既に実行されていないなら実行することを強制します。
1630 J2SE 5.0 ではそうしません。
1631 </p>
1632 <p>
1633 より多くの詳細と例と J2SE 5.0 のクラスの強制的な初期化の方法の提案は Sun の <a href="//java.sun.com/j2se/1.5.0 /compatibility.html#literal">article on Java SE compatibility</a> を参照してください。
1634 </p>
1635
1636
1637 <h3><a name="DLS_OVERWRITTEN_INCREMENT">DLS: 上書きされたインクリメント (DLS_OVERWRITTEN_INCR EMENT)</a></h3>
1638
1639
1640 <p>
1641 このコードは、インクリメント演算 (たとえば、<code>i++</code>) を実行してすぐに上書きしています。
1642 たとえば、<code>i = i++</code> は元の値をインクリメントした値で上書きします。
1643 </p>
1644
1645
1646 <h3><a name="DMI_ARGUMENTS_WRONG_ORDER">DMI: 逆にされた引数 (DMI_ARGUMENTS_WRONG_ORDER) </a></h3>
1647
1648
1649 <p>
1650 このメソッド呼び出しへの引数は、順序が間違っているように見えます。
1651 たとえば、呼び出し <code>Preconditions.checkNotNull("message", message)</code> は、引数を予約しまし た。チェックされる値は第一引数です。
1652 </p>
1653
1654
1655 <h3><a name="DMI_BAD_MONTH">DMI: 月のための間違った定数値 (DMI_BAD_MONTH)</a></h3>
1656
1657
1658 <p>
1659 このコードは、メソッドに0から11の範囲外の月定数値を渡しています。
1660 </p>
1661
1662
1663 <h3><a name="DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE">DMI: 正確に表されない double から構築され た BigDecimal (DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE)</a></h3>
1664
1665
1666 <p>
1667 このコードは、10進数の数にうまく変換されない double 値から BigDecimal を作成しています。
1668 たとえば、Java で <code>new BigDecimal(0.1)</code> と書くと、0.1と正確に等しい BigDecimal (スケールが1で スケールなしの値が1) が作成されると思うかもしれませんが、
1669 実際には0.1000000000000000055511151231257827021181583404541015625と等しくなります。
1670 </p>
1671 <p>
1672 おそらく <code>BigDecimal.valueOf(double d)</code> メソッドの使用が望ましいです。BigDecimal(たとえば、<c ode>BigDecimal.valueOf(0.1)</code> は0.1を与えます) を作成するためには double の文字列表現を使用します。
1673 </p>
1674
1675
1676 <h3><a name="DMI_CALLING_NEXT_FROM_HASNEXT">DMI: hasNext メソッドで next メソッドを呼び出している (DMI_CALLING_NEXT_FROM_HASNEXT)</a></h3>
1677
1678
1679 <p>
1680 <code>hasNext</code> メソッドは、<code>next</code> メソッドを呼び出しています。
1681 <code>hasNext</code> メソッドは、イテレータの状態を変更することになっていないので、ほぼ確実に間違っています。
1682 <code>next</code> メソッドがイテレータの状態を変更することになっています。
1683 </p>
1684
1685
1686 <h3><a name="DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES">DMI: コレクションは自分自身を含める べきではない (DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES)</a></h3>
1687
1688
1689 <p>
1690 この総称型コレクションメソッドへの呼び出しはコレクションに自分自身が含まれている場合 (たとえば、<code>s.contains(s)</code> が tr ue) にだけ意味があります。
1691 これが本当だとは思えないし、もし本当なら問題の原因になります (たとえば、無限再帰になっているハッシュコードの計算)。
1692 間違ったパラメータが渡されている可能性が高いです。
1693 </p>
1694
1695
1696 <h3><a name="DMI_DOH">DMI: D'oh! 無意味なメソッド呼び出し (DMI_DOH)</a></h3>
1697
1698
1699 <p>
1700 この部分的なメソッド呼び出しは、検査から明らかな理由で意味がありません。
1701 </p>
1702
1703
1704 <h3><a name="DMI_INVOKING_HASHCODE_ON_ARRAY">DMI: 配列で hashCode メソッドを呼び出している (DMI _INVOKING_HASHCODE_ON_ARRAY)</a></h3>
1705
1706
1707 <p>
1708 このコードは、配列で <code>hashCode</code> メソッドを呼び出しています。
1709 配列で <code>hashCode</code> メソッドを呼び出すことは、System.identityHashCode と同じ値を返すので、コンテンツと配 列の長さを無視します。
1710 配列 <code>a</code> のコンテンツによるハッシュコードを必要とするなら、<code>java.util.Arrays.hashCode(a)</c ode> を使用してください。
1711 </p>
1712
1713
1714 <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>
1715
1716
1717 <p>
1718 <code>Double.longBitsToDouble()</code> の呼び出しで、32ビット int 値が引数として渡されています。
1719 これはほぼ間違いなく意図したことではありませんし意図した結果を与えることはほとんどありません。
1720 </p>
1721
1722
1723 <h3><a name="DMI_VACUOUS_SELF_COLLECTION_CALL">DMI: コレクションへの無意味な呼び出し (DMI_VACUOU S_SELF_COLLECTION_CALL)</a></h3>
1724
1725
1726 <p>
1727 この呼び出しは意味がありません。
1728 どんなコレクション <code>c</code> も <code>c.containsAll(c)</code> を呼び出すことは常に true であるべきです 。
1729 そして、<code>c.retainAll(c)</code> は効果があるはずがありません。
1730 </p>
1731
1732
1733 <h3><a name="DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION">Dm: ランタイムリテンションなしで、アノテ ーションの存在を調べるためにリフレクションを使用することはできない (DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION)< /a></h3>
1734
1735
1736 <p>
1737 アノテーションは、<code>@Retention(RetentionPolicy.RUNTIME)</code> でアノテートされなければ、リフレクション ( たとえば、<code>isAnnotationPresent(...)</code> メソッド) を使用して観測することができません。
1738 </p>
1739
1740
1741 <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>
1742
1743
1744 <p>
1745 <code>ScheduledThreadPoolExecutor</code> は <code>ThreadPoolExecutor</code> から継承さ れますが継承されたチューニングメソッドの一部は有用ではありません。
1746 特に、corePoolSize スレッドとアンバウンド形式のキューを使用する固定サイズプールとして動作するので、maximumPoolSize の調整は有用な効 果がありません。<br>
1747 (<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/Sched uledThreadPoolExecutor.html">Javadoc</a>)
1748 </p>
1749
1750
1751 <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>
1752
1753
1754 <p>
1755 コアプールサイズが0の <code>ScheduledThreadPoolExecutor</code> は決して何も実行しません。
1756 最大プールサイズへの変更は無視されます。<br>
1757 (<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/Sched uledThreadPoolExecutor.html#ScheduledThreadPoolExecutor(int)">Javadoc</a>)
1758 </p>
1759
1760
1761 <h3><a name="DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD">Dm: EasyMock メソッドへの役に立たない/無意味な 呼び出し (DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD)</a></h3>
1762
1763
1764 <p>
1765 この呼び出しは EasyMock メソッドにどんなオブジェクトも渡さないので何もしません。
1766 </p>
1767
1768
1769 <h3><a name="DM_INVALID_MIN_MAX">Dm: Math.max と Math.min の間違った組み合わせ (DM_INVALID_ MIN_MAX)</a></h3>
1770
1771
1772 <p>
1773 このコードは、<code>Math.min(0, Math.max(100, value))</code> のような構文を使用して境界値を制限しようとしています 。
1774 しかしながら、定数の順序が間違っています。 <code>Math.min(100, Math.max(0, value))</code> とすべきです。
1775 結果としてこのコードは常に同じ結果 (もし値が NaN なら NaN) を作り出します。
1776 </p>
1777
1778
1779 <h3><a name="EC_ARRAY_AND_NONARRAY">EC: equals メソッドを使用して配列と非配列を比較している (EC_ARRAY_ AND_NONARRAY)</a></h3>
1780
1781
1782 <p>
1783 このメソッドは、配列と配列だと思われない参照を比較するために <code>.equals(Object o)</code> を呼び出しています。
1784 比較されているものが違う型なら等しくないことであることが保証されているので、比較はほぼ間違いなく誤りです。
1785 たとえそれらが両方とも配列だったとしても、配列の <code>equals</code> メソッドは2つの配列が同じオブジェクトだと決定するだけです。
1786 配列のコンテンツを比較するためには <code>java.util.Arrays.equals(Object[], Object[])</code> を使用して ください。
1787 </p>
1788
1789
1790 <h3><a name="EC_BAD_ARRAY_COMPARE">EC: 配列の equals メソッド呼び出しは == と等価である (EC_BAD_AR RAY_COMPARE)</a></h3>
1791
1792
1793 <p>
1794 このメソッドは、配列で <code>.equals(Object o)</code> を呼び出しています。
1795 配列は、<code>Object</code> の <code>equals</code> メソッドをオーバーライドしないので、配列で <code>equals </code> メソッドを呼び出すことはアドレスを比較することと同じです。
1796 配列のコンテンツを比較するためには <code>java.util.Arrays.equals(Object[], Object[])</code> を使用して ください。
1797 配列のアドレスを比較するために明示的に <code>==</code> を使用して参照等価性をチェックすることは、それほど紛らわしくないでしょう。
1798 </p>
1799
1800
1801 <h3><a name="EC_INCOMPATIBLE_ARRAY_COMPARE">EC: equals(...) メソッドを使用して互換性のない配列を比較 している (EC_INCOMPATIBLE_ARRAY_COMPARE)</a></h3>
1802
1803
1804 <p>
1805 このメソッドは、互換性のない型の配列を比較するために <code>.equals(Object o)</code> を呼び出しています (たとえば、<code> String[]</code> と <code>StringBuffer[]</code>、<code>String[]</code> と <code>int[ ]</code>) 。
1806 それらは、決して等価ではありません。
1807 さらに、<code>equals(...)</code> が配列を比較するのに使用されるとき、それらが同じ配列であるかどうか確かめるだけで、配列のコンテンツは無 視します。
1808 </p>
1809
1810
1811 <h3><a name="EC_NULL_ARG">EC: equals(null) の呼び出し (EC_NULL_ARG)</a></h3>
1812
1813
1814 <p>
1815 このメソッドは、 null 値の引数を渡して <code>equals(Object)</code> を呼び出しています。
1816 <code>equals</code> メソッドの規約によると、この呼び出しは常に false を返すはずです。
1817 </p>
1818
1819
1820 <h3><a name="EC_UNRELATED_CLASS_AND_INTERFACE">EC: equals メソッドを呼び出して無関係のクラスとインタフ ェースを比較している (EC_UNRELATED_CLASS_AND_INTERFACE)</a></h3>
1821
1822
1823 <p>
1824 このメソッドは、一方がクラスで他方がインタフェースである2つの参照で <code>equals(Object)</code> メソッドを呼び出しています。
1825 クラスは、そのクラスの非抽象サブクラスも含めてインタフェースを実装していません。
1826 したがって比較されている2つのオブジェクトは実行時に同じクラスのメンバである可能性が低いです (いくつかのアプリケーションクラスが解析できなかったか、動的クラス ローディングが実行時に起こることができた場合を除く)。
1827 <code>equals</code> メソッドの規約によると、異なるクラスのオブジェクトは常に等しくないとして比較するべきです。
1828 したがって、<code>java.lang.Object.equals(Object)</code> によって定義される規約によれば、この比較の結果は実行時に常 に false になります。
1829 </p>
1830
1831
1832 <h3><a name="EC_UNRELATED_INTERFACES">EC: equals メソッドを呼び出して異なる型のインタフェースを比較している ( EC_UNRELATED_INTERFACES)</a></h3>
1833
1834
1835 <p>
1836 このメソッドは、どちらも他方のサブタイプでない無関係なインタフェース型の2つの参照で <code>equals(Object)</code> メソッドを呼び出し ています。
1837 そして、両方のインタフェースを実装する既知の非抽象クラスがありません。
1838 したがって比較されている2つのオブジェクトは実行時に同じクラスのメンバである可能性が低いです (いくつかのアプリケーションクラスが解析できなかったか、動的クラス ローディングが実行時に起こることができた場合を除く)。
1839 <code>equals</code> メソッドの規約によると、異なるクラスのオブジェクトは常に等しくないとして比較するべきです。
1840 したがって、<code>java.lang.Object.equals(Object)</code> によって定義される規約によれば、この比較の結果は実行時に常 に false になります。
1841 </p>
1842
1843
1844 <h3><a name="EC_UNRELATED_TYPES">EC: equals メソッドを呼び出して異なる型を比較している (EC_UNRELATED_ TYPES)</a></h3>
1845
1846
1847 <p>
1848 このメソッドは、異なるクラス型の2つの参照で <code>equals(Object)</code> メソッドを呼び出していて、解析が実行時に異なるクラスのオ ブジェクトになることを示唆しています。
1849 さらに、呼び出されるであろう equals メソッドの検査では、この呼び出しは常に false を返すか、
1850 あるいは equals メソッドが対称 (Object クラスの equals のための契約に必要な性質) ではないことのどちらかを示唆しています。
1851 </p>
1852
1853
1854 <h3><a name="EC_UNRELATED_TYPES_USING_POINTER_EQUALITY">EC: 参照等価性を使用して異なる型を比較してい る (EC_UNRELATED_TYPES_USING_POINTER_EQUALITY)</a></h3>
1855
1856
1857 <p>
1858 このメソッドは異なる型と思われる2つの参照を比較するために参照等価性を使用しています。
1859 この比較の結果は、常に false です。
1860 </p>
1861
1862
1863 <h3><a name="EQ_ALWAYS_FALSE">Eq: equals メソッドは常に false を戻す (EQ_ALWAYS_FALSE)</a> </h3>
1864
1865
1866 <p>
1867 このクラスでは、常に false を返す <code>equlas</code> メソッドを定義しています。
1868 これはオブジェクトがそれ自身と等価ではないことを意味していて、このクラスの有用な Map や Set を作成できません。
1869 より根本的に、<code>equals</code> メソッドの要件の一つである反射性を満たしていないことになります。
1870 </p>
1871 <p>
1872 おそらく意図されたことは、オブジェクトはそれ自身と等価であるというオブジェクト同一性です。
1873 これは <code>Object</code> クラスから継承される振る舞いです。
1874 異なるスーパークラスから継承される <code>equals</code> メソッドをオーバーライドする必要があるなら以下のようなコードが使えます。
1875 </p>
1876 <blockquote><pre>
1877 public boolean equals(Object o) {
1878 return this == o;
1879 }
1880 </pre></blockquote>
1881
1882
1883 <h3><a name="EQ_ALWAYS_TRUE">Eq: equals メソッドは常に true を返す (EQ_ALWAYS_TRUE)</a></h 3>
1884
1885
1886 <p>
1887 このクラスは、常に true を返す <code>equals</code> メソッドを定義しています。
1888 これは想像力に富むが、あまり良い方法とはいえません。さらに、<code>equals</code> メソッドが対称的ではないことを意味します。
1889 </p>
1890
1891
1892 <h3><a name="EQ_COMPARING_CLASS_NAMES">Eq: equals メソッドはクラスオブジェクトではなくクラス名を比較している (EQ_COMPARING_CLASS_NAMES)</a></h3>
1893
1894
1895 <p>
1896 このメソッドは、クラス名を比較することによって、2つのオブジェクトが同じクラスなのか確かめています。
1897 異なるクラスローダによってロードされたクラスなら、同じ名前で異なるクラスがある可能性があります。
1898 クラスオブジェクトが同じなのか確かめてください。
1899 </p>
1900
1901
1902 <h3><a name="EQ_DONT_DEFINE_EQUALS_FOR_ENUM">Eq: 列挙型は共変な equals メソッドを定義している (EQ_ DONT_DEFINE_EQUALS_FOR_ENUM)</a></h3>
1903
1904
1905 <p>
1906 このクラスは列挙を定義していて、列挙の等価性はオブジェクト同一性を使用して定義されています。
1907 列挙値のために共変な <code>equals</code> メソッドを定義することは、ひどいバッドプラクティスです。
1908 2つの異なる列挙値が <code>equals</code> メソッドでは「等価ではない」と判定され、共変な <code>equals</code> メソッドで は「等価」と判定されるからです。
1909 共変な <code>equals</code> メソッドを定義しないでください。
1910 </p>
1911
1912
1913 <h3><a name="EQ_OTHER_NO_OBJECT">Eq: equals(Object) メソッドをオーバーライドしていない equals メソッ ドの定義 (EQ_OTHER_NO_OBJECT)</a></h3>
1914
1915
1916 <p>
1917 このクラスは、<code>equals</code> メソッドを定義していますが、<code>java.lang.Object</code> クラスの <cod e>equals(Object)</code> メソッドをオーバーライドしていません。
1918 その代わりに、スーパークラスから <code>equals(Object)</code> メソッドを継承して、<code>boolean equals(Obje ct)</code> メソッドを定義するべきです。
1919 </p>
1920
1921
1922 <h3><a name="EQ_OTHER_USE_OBJECT">Eq: Object.equals(Object) をオーバーライドしていない equals メソッドの定義 (EQ_OTHER_USE_OBJECT)</a></h3>
1923
1924
1925 <p>
1926 このクラスは、<code>equals</code> メソッドを定義していますが、<code>java.lang.Object</code> クラスの <cod e>equals(Object)</code> メソッドをオーバーライドしていません。
1927 クラスは、<code>boolean equals(Object)</code> メソッドを定義するべきです。
1928 </p>
1929
1930
1931 <h3><a name="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC">Eq: equals メソッドはスーパークラスの equals メソッドをオーバーライドしているが、対称的ではないかもしれない (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC)</a></h3>
1932
1933
1934 <p>
1935 このクラスはスーパークラスの <code>equals</code> メソッドをオーバーライドする <code>equals</code> メソッドを定義してい ます。
1936 両方の <code>equals</code> メソッドは、2つのオブジェクトが等しいかどうかの判定で、<code>instanceof</code> を使用し ています。
1937 <code>equals</code> メソッドは対称的 (<code>a.equals(b) == b.equals(a)</code>) であることが重要な のでこれは危険を伴っています。
1938 <i>B</i> が <i>A</i> のサブタイプなら <i>A</i> の <code>equals</code> メソッドは引数が <code>insta nceof A</code> なのかチェックします。
1939 そして、<i>B</i> の <code>equals</code> メソッドは引数が <code>instanceof B</code> なのかチェックします 。
1940 これらのメソッドによって定義された同値関係が対称的でないということです。
1941 </p>
1942
1943
1944 <h3><a name="EQ_SELF_USE_OBJECT">Eq: 共変な equals メソッドを定義して、Object.equals(Object) を継承している (EQ_SELF_USE_OBJECT)</a></h3>
1945
1946
1947 <p>
1948 このクラスは、共変な <code>equals</code> メソッドを定義していますが、 <code>equals(Object)</code> メソッドは <code>java.lang.Object</code> クラスから継承しています。
1949 クラスは、<code>boolean equals(Object)</code> メソッドを定義するべきです。
1950 </p>
1951
1952
1953 <h3><a name="FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER">FE: NaN への等価性のための絶望的なテスト (FE_TEST _IF_EQUAL_TO_NOT_A_NUMBER)</a></h3>
1954
1955
1956 <p>
1957 このコードは、浮動小数点が特別な非数値と等価であるか確かめています (たとえば <code>if (x == Double.NaN)</code>)。
1958 しかしながら、<code>NaN</code> の特別な意味のため、値は <code>NaN</code> と等価ではありません。
1959 したがって、<code>x == Double.NaN</code> は常に false と評価します。
1960 <code>x</code> という値が特別な非数値であるかどうか確かめるためには <code>Double.isNaN(x)</code> を使用します (ま たは <code>x</code> が浮動小数点精度であるなら <code>Float.isNaN(x)</code>)。
1961 </p>
1962
1963
1964 <h3><a name="VA_FORMAT_STRING_BAD_ARGUMENT">FS: 書式指示子へ渡している引数に互換性がない (VA_FORMAT_ STRING_BAD_ARGUMENT)</a></h3>
1965
1966
1967 <p>
1968 書式指示子は、対応する引数と互換性がありません。
1969 たとえば、<code>System.out.println("%d\n", "hello");</code> の %d 書式指示子は数値の引数を必要としますが数 値ではなく文字列が渡されています。
1970 この文が実行されると実行時例外が発生します。
1971 </p>
1972
1973
1974 <h3><a name="VA_FORMAT_STRING_BAD_CONVERSION">FS: 与えられた引数の型は書式指示子に合致しません (VA_FOR MAT_STRING_BAD_CONVERSION)</a></h3>
1975
1976
1977 <p>
1978 引数の1つは、対応する書式指示子と互換性がありません。その結果、実行されるときに実行時例外を生成します。
1979 たとえば、<code>String.format("%d", "1")</code> は、文字列 "1" が書式指示子 "%d" と互換性がないので例外を生成し ます。
1980 </p>
1981
1982
1983 <h3><a name="VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED">FS: printf スタイルの 書式が期待されているところで MessageFormat が与えられている (VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_ SUPPLIED)</a></h3>
1984
1985
1986 <p>
1987 Java の printf 書式文字列と引数のリストを期待するメソッドが呼び出されています。
1988 しかしながら、書式文字列にはどんな書式指示子 (たとえば、%s) も含まないで、メッセージフォーマットの要素 (たとえば、{0}) を含んでいます。
1989 printf スタイルの書式文字列が必要なときに、MessageFormat の文字列を与えている可能性が高いです。
1990 実行時に、すべての引数は無視され、書式文字列は正確にフォーマットされずに返されます。
1991 </p>
1992
1993
1994 <h3><a name="VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED">FS: 書式文字列で実際に使われるより、多くの引数が 渡されている (VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED)</a></h3>
1995
1996
1997 <p>
1998 可変長引数による書式文字列メソッドが呼び出されていますが書式文字列で実際に使われるより多くの引数が渡されています。
1999 これは実行時例外の原因とはなりませんが、コードはフォーマットされた文字列に含まれることを意図した情報を黙って省略しているかもしれません。
2000 </p>
2001
2002
2003 <h3><a name="VA_FORMAT_STRING_ILLEGAL">FS: 無効な書式文字列 (VA_FORMAT_STRING_ILLEGAL)</ a></h3>
2004
2005
2006 <p>
2007 書式文字列は構文的に無効です。この文が実行されると実行時例外が発生します。
2008 </p>
2009
2010
2011 <h3><a name="VA_FORMAT_STRING_MISSING_ARGUMENT">FS: 書式文字列は足りない引数を参照している (VA_FORM AT_STRING_MISSING_ARGUMENT)</a></h3>
2012
2013
2014 <p>
2015 書式文字列で書式指示子を満たすために十分な引数が渡されていません。この文が実行されると実行時例外が発生します。
2016 </p>
2017
2018
2019 <h3><a name="VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT">FS: 書式文字列ための前の引数がない (VA_FORM AT_STRING_NO_PREVIOUS_ARGUMENT)</a></h3>
2020
2021
2022 <p>
2023 この書式文字列は、前の書式指示子の引数が再利用されるようにするために「相対インデックス ("&lt;")」を指定しています。
2024 しかしながら、前の引数がありません。
2025 たとえば、<code>formatter.format("%&lt;s %s", "a", "b")</code> が実行されると MissingFormatA rgumentException をスローします。
2026 </p>
2027
2028
2029 <h3><a name="GC_UNRELATED_TYPES">GC: 型パラメータとメソッド引数に関係がない (GC_UNRELATED_TYPES)</a ></h3>
2030
2031
2032 <p>
2033 総称型コレクションメソッドへの呼び出しにコレクションのパラメータとは互換性のないクラスの引数があります (すなわち、引数の型は総称型引数に対応するスーパタイプで もサブタイプでもありません)。
2034 したがって、コレクションにはここで使用されたメソッド引数と等価であるどんなオブジェクトも含まれていません。
2035 多分間違った値がメソッドに渡されています。
2036 一般的に2つの無関係なクラスのインスタンスは等価ではありません。
2037 たとえば、<code>Foo</code> と <code>Bar</code> クラスがサブタイプによって関係がないなら、<code>Foo</code> の インスタンスは <code>Bar</code> のインスタンスと等価のはずがありません。
2038 その他の問題で対称的ではない <code>equals</code> メソッドになる可能性が高いです。
2039 たとえば、<code>Foo</code> が <code>String</code> と等価であるように <code>Foo</code> クラスを定義するな ら、<code>String</code> は <code>String</code> だけと等価であるので、<code>equals</code> メソッドは 対称的ではありません。
2040 </p>
2041 <p>
2042 まれに、非対称 <code>equals</code> メソッドを定義して、まだ、何とかそれらのコードを機能させています。
2043 APIのどれも文書化していないか、保証もしていないが、<code>Collection&lt;String&gt;</code> に <code>Foo</co de> があるかどうか調べたいなら、
2044 引数の <code>equals</code> メソッド (たとえば、<code>Foo</code>クラスの <code>equals</code> メソッド ) を使用して等価性をチェックします。
2045 </p>
2046
2047
2048 <h3><a name="HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS">HE: ハッシュ化された文脈でハ ッシュ化できないクラスの使用がシグネチャで宣言されている (HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS) </a></h3>
2049
2050
2051 <p>
2052 メソッド、フィールド、クラスは、ハッシュ可能なクラスが必要な文脈で、ハッシュ化できないクラスが使用される総称的なシグネチャを宣言しています。
2053 クラスは、<code>equals</code> メソッドを宣言していますが、<code>hashCode</code> メソッドは <code>java.la ng.Object</code> から継承しています。
2054 これは「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に従っていないのでハ ッシュ化できません。
2055 </p>
2056
2057
2058 <h3><a name="HE_USE_OF_UNHASHABLE_CLASS">HE: ハッシュデータ構造で hashCode メソッドのないクラスを使用して いる (HE_USE_OF_UNHASHABLE_CLASS)</a></h3>
2059
2060
2061 <p>
2062 このクラスは、<code>equals(Object)</code> メソッドを定義していますが、<code>hashCode</code> メソッドを定義して いません。
2063 これは「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という <code>hashCode</code> メソッドの汎用規約に従っていません。
2064 このクラスのインスタンスはハッシュデータ構造で使われています。最重要問題を修正する必要があります。
2065 </p>
2066
2067
2068 <h3><a name="ICAST_INT_2_LONG_AS_INSTANT">ICAST: int 値を long に変換して絶対時間として使用している (ICAST_INT_2_LONG_AS_INSTANT)</a></h3>
2069
2070
2071 <p>
2072 このコードは、32ビット int 値を64ビット long 値に変換して、絶対時間値を必要とするメソッドパラメータに渡しています。
2073 絶対時間値は、「エポック」(すなわち、1970年1月1日、00:00:00 GMT)としてわかっている標準的な基準時間からのミリ秒数です。<br>
2074 たとえば、次のメソッド (エポックからの秒を Date へ変換することを意図した) はひどく壊れています。
2075 </p>
2076 <blockquote><pre>
2077 Date getDate(int seconds) { return new Date(seconds * 1000); }
2078 </pre></blockquote>
2079 <p>
2080 乗算は32ビット演算を使用して、64ビット値に変換されます。
2081 32ビット値は、64ビットに変換されて、絶対時間値を表すために使用されるとき、1969年12月と1970年1月の日付しか表せません。
2082 </p>
2083 <p>
2084 上記のメソッドの正しい実装は以下のとおりです。
2085 </p>
2086 <blockquote><pre>
2087 // 失敗、2037年後の日付
2088 Date getDate(int seconds) { return new Date(seconds * 1000L); }
2089
2090 // より良い、すべての日付で動作する
2091 Date getDate(long seconds) { return new Date(seconds * 1000); }
2092 </pre></blockquote>
2093
2094
2095 <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>
2096
2097
2098 <p>
2099 このコードは、整数値 (たとえば、int や long) を倍精度浮動小数点に変換してから、その結果を <code>Math.ceil()</code> に渡し ています。
2100 整数を double に変換すると小数部がない数値が得られるので、この演算は常にノーオペレーションになります。
2101 <code>Math.ceil()</code>に渡される値を生成した演算が倍精度浮動小数点演算を使用して実行することを意図した可能性が高いです。
2102 </p>
2103
2104
2105 <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>
2106
2107
2108 <p>
2109 このコードは、整数値を float 精度浮動小数点に変換してから、その結果を <code>Math.round()</code> に渡して引数に最も近い int /long を返します。
2110 整数を float に変換すると小数部がない数値が得られるので、この演算は常にノーオペレーションになります。
2111 <code>Math.round()</code>に渡される値を生成した演算が浮動小数点演算を使用して実行することを意図した可能性が高いです。
2112 </p>
2113
2114
2115 <h3><a name="IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD">IJU: run メソッドでの JUnit アサ ーションは JUnit によって通知されない (IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD)</a></h3>
2116
2117
2118 <p>
2119 <code>run</code> メソッドで JUnit アサーションが実行されています。失敗した JUnit アサーションは例外をスローします。
2120 したがって、この例外がテストメソッドを実行したスレッド以外のスレッドで発生するなら、例外はスレッドを終了させますが、テストの失敗になりません。
2121 </p>
2122
2123
2124 <h3><a name="IJU_BAD_SUITE_METHOD">IJU: TestCase は suite メソッドの間違った宣言をしている (IJU_B AD_SUITE_METHOD)</a></h3>
2125
2126
2127 <p>
2128 JUnit の TestCase クラスで、<code>suite</code> メソッドを実装しています。
2129 しかしながら、<code>suite</code> メソッドは、
2130 </p>
2131 <blockquote><pre>
2132 public static junit.framework.Test suite()
2133 </pre></blockquote>
2134 <p>か</p>
2135 <blockquote><pre>
2136 public static junit.framework.TestSuite suite()
2137 </pre></blockquote>
2138 <p>
2139 のどちらかを宣言する必要があります。
2140 </p>
2141
2142
2143 <h3><a name="IJU_NO_TESTS">IJU: TestCase はテストがない (IJU_NO_TESTS)</a></h3>
2144
2145
2146 <p>
2147 JUnit の TestCase クラスで、どんなテストメソッドも実装していません。
2148 </p>
2149
2150
2151 <h3><a name="IJU_SETUP_NO_SUPER">IJU: TestCase は super.setup() を呼び出さない setUp メソッ ドを実装している (IJU_SETUP_NO_SUPER)</a></h3>
2152
2153
2154 <p>
2155 JUnit の TestCase クラスで、<code>setUp</code> メソッドを実装しています。
2156 <code>setUp</code> メソッドは、<code>super.setUp()</code> を呼び出すべきなのにそうしていません。
2157 </p>
2158
2159
2160 <h3><a name="IJU_SUITE_NOT_STATIC">IJU: TestCase は 非 static な suite メソッドを実装している (IJU_SUITE_NOT_STATIC)</a></h3>
2161
2162
2163 <p>
2164 JUnit の TestCase クラスで、<code>suite</code> メソッドを実装しています。
2165 <code>suite</code> メソッドは static として宣言するべきなのにそうしていません。
2166 </p>
2167
2168
2169 <h3><a name="IJU_TEARDOWN_NO_SUPER">IJU: TestCase は super.tearDown() を呼び出さない tea rDown メソッドを実装している (IJU_TEARDOWN_NO_SUPER)</a></h3>
2170
2171
2172 <p>
2173 JUnit の TestCase クラスで、<code>tearDown</code> メソッドを実装しています。
2174 <code>tearDown</code> メソッドは、<code>super.tearDown()</code> を呼び出すべきなのにそうしていません。
2175 </p>
2176
2177
2178 <h3><a name="IL_CONTAINER_ADDED_TO_ITSELF">IL: コレクションは自分自身を追加している (IL_CONTAINER_ ADDED_TO_ITSELF)</a></h3>
2179
2180
2181 <p>
2182 コレクションは、自分自身を追加しています。その結果、hashCode を計算すると <code>StackOverflowException</code> をス ローします。
2183 </p>
2184
2185
2186 <h3><a name="IL_INFINITE_LOOP">IL: 明らかな無限ループ (IL_INFINITE_LOOP)</a></h3>
2187
2188
2189 <p>
2190 このループは、例外をスローする以外の方法で終了させることができないように思われます。
2191 </p>
2192
2193
2194 <h3><a name="IL_INFINITE_RECURSIVE_LOOP">IL: 明らかな無限再帰ループ (IL_INFINITE_RECURSIVE_ LOOP)</a></h3>
2195
2196
2197 <p>
2198 このメソッドは、無条件で自分自身を呼び出します。これはスタックオーバーフローになる無限再帰ループを示しています。
2199 </p>
2200
2201
2202 <h3><a name="IM_MULTIPLYING_RESULT_OF_IREM">IM: 整数剰余の結果の整数乗算 (IM_MULTIPLYING_RES ULT_OF_IREM)</a></h3>
2203
2204
2205 <p>
2206 このコードは、整数剰余の結果に整数定数を乗算しています。
2207 紛らわしい演算子の優先順位がないことを確実にしてください。
2208 たとえば、i % 60 * 1000 は、i % (60 * 1000) ではなく (i % 60) * 1000 となります。
2209 </p>
2210
2211
2212 <h3><a name="INT_BAD_COMPARISON_WITH_INT_VALUE">INT: int 値と long 定数との間違った比較 (INT _BAD_COMPARISON_WITH_INT_VALUE)</a></h3>
2213
2214
2215 <p>
2216 このコードは、int 値と int 値として表される値の範囲外の long 定数を比較しています。
2217 この比較は無意味で、おそらく間違っています。
2218 </p>
2219
2220
2221 <h3><a name="INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE">INT: 負でない値と負の定数またはゼロとの間違 った比較 (INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE)</a></h3>
2222
2223
2224 <p>
2225 このコードは、負でないことが保証されている値と負の定数またはゼロとを比較しています。
2226 </p>
2227
2228
2229 <h3><a name="INT_BAD_COMPARISON_WITH_SIGNED_BYTE">INT: 符号付きバイトの間違った比較 (INT_BAD_C OMPARISON_WITH_SIGNED_BYTE)</a></h3>
2230
2231
2232 <p>
2233 符号付バイトのとりうる値の範囲は-128~127です。その範囲外で符号付バイトを値と比較することは無意味で間違っていそうです。
2234 符号付きバイト <code>b</code> を範囲が0~255の符号なしバイトに変換するには <code>0xff &amp; b</code> を使用してく ださい。
2235 </p>
2236
2237
2238 <h3><a name="IO_APPENDING_TO_OBJECT_OUTPUT_STREAM">IO: オブジェクト出力ストリームへの追加は失敗に終わる (IO_APPENDING_TO_OBJECT_OUTPUT_STREAM)</a></h3>
2239
2240
2241 <p>
2242 このコードは、ファイルを追加モードで開いて、オブジェクト出力ストリームの中で結果をラップしています。
2243 これはファイルに格納された既存のオブジェクト出力ストリームに追加できないでしょう。
2244 オブジェクト出力ストリームに追加したいなら、オブジェクト出力ストリームを開いておく必要があります。
2245 </p>
2246 <p>
2247 追加モードでファイルを開き、オブジェクト出力ストリームで書き込むことができる唯一の状況は、
2248 ファイルを読み出すときにランダムアクセスモードで開き、追加を開始するところまでバイトオフセットをシークすると計画した場合です。
2249 </p>
2250
2251
2252 <h3><a name="IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN">IP: メソッドで読み取られずに上書きされているパラメータ (IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN)</a></h3>
2253
2254
2255 <p>
2256 このパラメータの初期値は無視され、ここで上書きされています。
2257 これは多くの場合、パラメータへの書き込みが呼び出し元に戻されるという誤った考えを示しています。
2258 </p>
2259
2260
2261 <h3><a name="MF_CLASS_MASKS_FIELD">MF: スーパークラスのフィールドを隠すフィールドを定義しているクラス (MF_CLASS _MASKS_FIELD)</a></h3>
2262
2263
2264 <p>
2265 このクラスは、スーパークラスの可視インスタンスフィールドと同じ名前でフィールドを定義しています。
2266 これは紛らわしくて、メソッドがフィールドを更新するかアクセスするなら、間違いを指摘するかもしれません。
2267 </p>
2268
2269
2270 <h3><a name="MF_METHOD_MASKS_FIELD">MF: フィールドを隠す変数を定義しているメソッド (MF_METHOD_MASKS_F IELD)</a></h3>
2271
2272
2273 <p>
2274 このメソッドは、このクラスまたはスーパークラスのフィールドと同じ名前でローカル変数を定義しています。
2275 フィールドから初期化されていない値を読み出す、初期化されていないフィールドをそのままにしておくか、または両方を引き起こすかもしれません。
2276 </p>
2277
2278
2279 <h3><a name="NP_ALWAYS_NULL">NP: null 値を利用している (NP_ALWAYS_NULL)</a></h3>
2280
2281
2282 <p>
2283 ここで null 値を利用しようとしています。
2284 コードが実行されると NullPointerException が発生します。
2285 </p>
2286
2287
2288 <h3><a name="NP_ALWAYS_NULL_EXCEPTION">NP: null 値を例外経路で利用している (NP_ALWAYS_NULL_EX CEPTION)</a></h3>
2289
2290
2291 <p>
2292 例外経路上のここで null 値を利用しています。コードが実行されると NullPointerException が発生します。
2293 現在の FindBugs は実行不可能な例外経路を刈り取れていないので、誤検出かもしれないことに注意してください。
2294 </p>
2295 <p>
2296 switch 文の default が多くの場合実行不可能なので FindBugs が例外経路である default を検討することに注意して下さい。
2297 </p>
2298
2299
2300 <h3><a name="NP_ARGUMENT_MIGHT_BE_NULL">NP: null の引数をチェックしていないメソッド (NP_ARGUMENT_ MIGHT_BE_NULL)</a></h3>
2301
2302
2303 <p>
2304 このメソッドへのパラメータが null かどうか確かめるために常にチェックされるべき値として特定されました。
2305 しかし、null チェックをしないで、null 値が利用されています。
2306 </p>
2307
2308
2309 <h3><a name="NP_CLOSING_NULL">NP: 常に null 値のオブジェクトで close メソッドを呼び出している (NP_CLOSI NG_NULL)</a></h3>
2310
2311
2312 <p>
2313 <code>close</code> メソッドは、常に null 値のオブジェクトで呼び出されています。
2314 この文が実行されるなら NullPointerException が発生します。
2315 ここでクローズするべき何かを決してクローズしないという大きな危険性があります。
2316 </p>
2317
2318
2319 <h3><a name="NP_GUARANTEED_DEREF">NP: null 値を利用することが保証されている (NP_GUARANTEED_DEREF )</a></h3>
2320
2321
2322 <p>
2323 文または分岐が実行されるなら、この時点で値は null であり、null 値を利用する (フォワードパスで実行時例外を伴うこと以外は) ことが保証されています。
2324 </p>
2325 <p>
2326 なお、<code>if (x == null) throw new NullPointerException();</code> は <code>x</code > の参照解除として扱われることに注意して下さい。
2327 </p>
2328
2329
2330 <h3><a name="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH">NP: null 値を例外経路で利用することが保証されて いる (NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH)</a></h3>
2331
2332
2333 <p>
2334 例外経路上の文または分岐が実行されるなら、この時点で値は null であり、null 値を利用する (フォワードパスで実行時例外を伴うこと以外は) ことが保証さ れています。
2335 </p>
2336
2337
2338 <h3><a name="NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR">NP: 非 null フィールドは初 期化されていない (NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR)</a></h3>
2339
2340
2341 <p>
2342 フィールドは、非 null としてマークされていますが、コンストラクタで書き込まれていません。
2343 フィールドは、コンストラクタの間、ほかの場所で初期化されるか、または使用する前に常に初期化されるかもしれません。
2344 </p>
2345
2346
2347 <h3><a name="NP_NONNULL_PARAM_VIOLATION">NP: メソッド呼び出しは非 null パラメータに対して null を渡して いる (NP_NONNULL_PARAM_VIOLATION)</a></h3>
2348
2349
2350 <p>
2351 このメソッドは、非 null でなければならないメソッドのパラメータとして、null 値を渡しています。
2352 このパラメータは、@Nonnull として明示的にアノテートされていたか、または解析が常に null 値を利用すると示していました。
2353 </p>
2354
2355
2356 <h3><a name="NP_NONNULL_RETURN_VIOLATION">NP: null を返すかもしれないメソッドが @Nonnull 宣言されて いる (NP_NONNULL_RETURN_VIOLATION)</a></h3>
2357
2358
2359 <p>
2360 このメソッドは、null 値を返すかもしれないのにメソッド (またはスーパークラスのメソッド) の戻り値に @Nonnull が宣言されています。
2361 </p>
2362
2363
2364 <h3><a name="NP_NULL_INSTANCEOF">NP: null とわかっている値をその型のインスタンスなのか確かめている (NP_NULL_ INSTANCEOF)</a></h3>
2365
2366
2367 <p>
2368 チェックされている値が null であることが保証されているので、instanceof は常に faluse を返します。
2369 これは安全で、誤解や論理エラーを指摘していないことを確認してください。
2370 </p>
2371
2372
2373 <h3><a name="NP_NULL_ON_SOME_PATH">NP: null 値を利用している可能性がある (NP_NULL_ON_SOME_PATH )</a></h3>
2374
2375
2376 <p>
2377 そこで分岐または文が実行されるなら null 値が利用されて NullPointerException が発生します。
2378 もちろん、問題は分岐または文が実行不可能で、NullPointerException が決して発生する可能性がないということかもしれません。
2379 それを決めるのは FindBugs の能力を超えています。
2380 </p>
2381
2382
2383 <h3><a name="NP_NULL_ON_SOME_PATH_EXCEPTION">NP: null 値を例外経路で利用している可能性がある (NP_NU LL_ON_SOME_PATH_EXCEPTION)</a></h3>
2384
2385
2386 <p>
2387 例外経路上のここで null 値が利用されています。コードが実行されると NullPointerException を引き起こすことがあります。
2388 現在の FindBugs は実行不可能な例外経路を刈り取れていないので、誤検出かもしれないことに注意してください。
2389 </p>
2390 <p>
2391 switch 文の default が多くの場合実行不可能なので FindBugs が例外経路である default を検討することに注意して下さい。
2392 </p>
2393
2394
2395 <h3><a name="NP_NULL_PARAM_DEREF">NP: メソッド呼び出しは非 null パラメータに対して null を渡している (NP_ NULL_PARAM_DEREF)</a></h3>
2396
2397
2398 <p>
2399 このメソッド呼び出しは非 null メソッドパラメータに対して null 値を渡しています。
2400 パラメータは、常に非 null とすべきパラメータとしてアノテートされていたか、または解析が常に null 値を利用すると示していました。
2401 </p>
2402
2403
2404 <h3><a name="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS">NP: メソッド呼び出しは非 null パラメー タに対して null を渡している (NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS)</a></h3>
2405
2406
2407 <p>
2408 すべての既知のターゲットメソッドが非 null であることをパラメータに要求する呼び出し場所で、おそらく null 値を渡しています。
2409 パラメータは、常に非 null とすべきパラメータとしてアノテートされていたか、または解析が常に null 値を利用すると示していました。
2410 </p>
2411
2412
2413 <h3><a name="NP_NULL_PARAM_DEREF_NONVIRTUAL">NP: 非 null パラメータに null を渡している非仮想メソッ ドの呼び出し (NP_NULL_PARAM_DEREF_NONVIRTUAL)</a></h3>
2414
2415
2416 <p>
2417 null の可能性がある値が 非 null メソッドパラメータに渡されています。
2418 パラメータは、常に非 null とすべきパラメータとしてアノテートされていたか、または解析が常に null 値を利用すると示していました。
2419 </p>
2420
2421
2422 <h3><a name="NP_OPTIONAL_RETURN_NULL">NP: Optional の戻り型を持つメソッドが明示的に null を返す (NP _OPTIONAL_RETURN_NULL)</a></h3>
2423
2424
2425 <p>
2426 Optional の戻り型の使い方は、常に明示的に null を返すのは設計が望ましくないことを意味します。
2427 null 値をこのようなケースで返すことは契約違反で、多分クライアントコードを破壊するでしょう。
2428 </p>
2429
2430
2431 <h3><a name="NP_STORE_INTO_NONNULL_FIELD">NP: @Nonnull でアノテートされたフィールドに null を格納し ている (NP_STORE_INTO_NONNULL_FIELD)</a></h3>
2432
2433
2434 <p>
2435 @Nonnull としてアノテートされたフィールドに null かもしれない値を格納しています。
2436 </p>
2437
2438
2439 <h3><a name="NP_UNWRITTEN_FIELD">NP: 書き込まれていないフィールドの読み出し (NP_UNWRITTEN_FIELD)</a ></h3>
2440
2441
2442 <p>
2443 プログラムは、決して null でない値を書き込むとは思われないフィールドの値を利用しています。
2444 この値を利用すると NullPointerException が発生します。
2445 </p>
2446
2447
2448 <h3><a name="NM_BAD_EQUAL">Nm: クラスは equal(Object) を定義しています。equals(Object) にすべきです か? (NM_BAD_EQUAL)</a></h3>
2449
2450
2451 <p>
2452 このクラスは、<code>equal(Object)</code> という名前のメソッドを定義しています。
2453 このメソッドは、<code>java.lang.Object</code> の <code>equals(Object)</code> を (おそらく意図的に) オーバーライドしていません。
2454 </p>
2455
2456
2457 <h3><a name="NM_LCASE_HASHCODE">Nm: クラスは hashcode() を定義しています。hashCode() にすべきですか? (NM_LCASE_HASHCODE)</a></h3>
2458
2459
2460 <p>
2461 このクラスは、<code>hashcode()</code> という名前のメソッドを定義しています。
2462 このメソッドは、<code>java.lang.Object</code> の <code>hashCode</code> メソッドを (おそらく意図的に) オ ーバーライドしていません。
2463 </p>
2464
2465
2466 <h3><a name="NM_LCASE_TOSTRING">Nm: クラスは tostring() を定義しています。toString() にすべきですか? (NM_LCASE_TOSTRING)</a></h3>
2467
2468
2469 <p>
2470 このクラスは、<code>tostring()</code> という名前のメソッドを定義しています。
2471 このメソッドは、<code>java.lang.Object</code> の <code>toString</code> メソッドを (おそらく意図的に) オ ーバーライドしていません。
2472 </p>
2473
2474
2475 <h3><a name="NM_METHOD_CONSTRUCTOR_CONFUSION">Nm: 明らかなメソッドとコンストラクタの混乱 (NM_METHOD _CONSTRUCTOR_CONFUSION)</a></h3>
2476
2477
2478 <p>
2479 この正規のメソッドは定義しているクラスと同じ名前です。
2480 これはコンストラクタを意図していた可能性が高いです。もしそうなら void 戻り値の宣言を除去してください。
2481 偶然メソッドを定義したことが間違いだとわかり、適切なコンストラクタを定義したが、後方互換性のためにこのメソッドを除去できないならメソッドを非推奨にしてください。
2482 </p>
2483
2484
2485 <h3><a name="NM_VERY_CONFUSING">Nm: 非常に紛らわしい名前のメソッド (NM_VERY_CONFUSING)</a></h3>
2486
2487
2488 <p>
2489 参照されたメソッドは、大文字の使い方だけによって異なる名前があります。
2490 大文字の使い方が同一ならメソッドの1つが他のメソッドをオーバーライドするので、非常に紛らわしいです。
2491 </p>
2492
2493
2494 <h3><a name="NM_WRONG_PACKAGE">Nm: パラメータの間違ったパッケージのためにスーパークラスのメソッドをオーバーライドしていないメ ソッド (NM_WRONG_PACKAGE)</a></h3>
2495
2496
2497 <p>
2498 パラメータの型がスーパークラスで対応するパラメータの型と正確に合致していないので、サブクラスのメソッドはスーパークラスの類似したメソッドをオーバーライドしていま せん。<br>
2499 たとえば以下のようなコードです。
2500 </p>
2501 <blockquote><pre>
2502 import alpha.Foo;
2503
2504 public class A {
2505 public int f(Foo x) { return 17; }
2506 }
2507 ----
2508 import beta.Foo;
2509
2510 public class B extends A {
2511 public int f(Foo x) { return 42; }
2512 }
2513 </pre></blockquote>
2514 <p>
2515 クラス <code>B</code> で定義された <code>f(Foo)</code> メソッドは、クラス <code>A</code> の <code>f (Foo)</code> メソッドをオーバーライドしていません。
2516 これは引数の型 <code>Foo</code> が違うパッケージだからです。
2517 </p>
2518
2519
2520 <h3><a name="QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT">QBA: 論理式で boolean リテラル値を代入している メソッド (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT)</a></h3>
2521
2522
2523 <p>
2524 このメソッドは、if または while の式の中の boolean 変数に boolean リテラル値 (true または false) を代入しています。
2525 おそらく、これは = による代入ではなく、== を使用して論理比較をすることになっていました。
2526 </p>
2527
2528
2529 <h3><a name="RANGE_ARRAY_INDEX">RANGE: 配列インデックスは範囲外 (RANGE_ARRAY_INDEX)</a></h3>
2530
2531
2532 <p>
2533 配列演算が行なわれますが、配列インデックスが範囲外なので実行時に ArrayIndexOutOfBoundsException が発生するでしょう。
2534 </p>
2535
2536
2537 <h3><a name="RANGE_ARRAY_LENGTH">RANGE: 配列の長さは範囲外 (RANGE_ARRAY_LENGTH)</a></h3>
2538
2539
2540 <p>
2541 メソッドは、配列パラメータと長さパラメータで呼び出されますが、長さは範囲外です。
2542 実行時に IndexOutOfBoundsException が発生するでしょう。
2543 </p>
2544
2545
2546 <h3><a name="RANGE_ARRAY_OFFSET">RANGE: 配列オフセットは範囲外 (RANGE_ARRAY_OFFSET)</a></h3 >
2547
2548
2549 <p>
2550 メソッドは、配列パラメータとオフセットパラメータで呼び出されますが、オフセットは範囲外です。
2551 実行時に IndexOutOfBoundsException が発生するでしょう。
2552 </p>
2553
2554
2555 <h3><a name="RANGE_STRING_INDEX">RANGE: 文字列インデックスは範囲外 (RANGE_STRING_INDEX)</a></ h3>
2556
2557
2558 <p>
2559 文字列メソッドが呼び出されます。指定された文字列インデックスは範囲外です。
2560 実行時に StringIndexOutOfBoundsException が発生するでしょう。
2561 </p>
2562
2563
2564 <h3><a name="RC_REF_COMPARISON">RC: 疑わしい参照比較 (RC_REF_COMPARISON)</a></h3>
2565
2566
2567 <p>
2568 このメソッドは、 == または != 演算子を使用して2つの参照値を比較しています。
2569 一般的にこの型のインスタンスを比較する正しい方法は <code>equals</code> メソッドです。
2570 等価で識別可能なインスタンスを作成する可能性がありますが異なるオブジェクトなので == で比較しないでください。
2571 参照によって一般に比較されるべきでないクラスの例は、<code>java.lang.Integer</code> 、<code>java.lang.Float< /code> などです。
2572 </p>
2573
2574
2575 <h3><a name="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE">RCN: 既に利用していた値の null チェック (RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE)</a></h3>
2576
2577
2578 <p>
2579 ここで値が null なのかチェックしていますが、既に値を利用していたので null である可能性はありません。
2580 値が null なら以前の利用で NullPointerException が発生していたでしょう。
2581 基本的に、値が null であることを許すのかどうかに関係なく、このコードと以前の値の利用は一致しません。
2582 チェックは冗長か、または以前の値の利用は誤りです。
2583 </p>
2584
2585
2586 <h3><a name="RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION">RE: 正規表現のための無効な構文 (RE_BAD_SYN TAX_FOR_REGULAR_EXPRESSION)</a></h3>
2587
2588
2589 <p>
2590 このコードは、正規表現の構文によると無効である正規表現を使用しています。
2591 この文が実行されるとき PatternSyntaxException をスローします。
2592 </p>
2593
2594
2595 <h3><a name="RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION">RE: 正規表現のために使われてい る File.separator (RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION)</a></h3>
2596
2597
2598 <p>
2599 このコードは、正規表現が必要な場所で、<code>File.separator</code> を使用しています。
2600 これは <code>File.separator</code> がバックスラッシュである Windows プラットホームでは失敗します。
2601 バックスラッシュは正規表現ではエスケープ文字として解釈されます。
2602 その他の選択肢としては、<code>File.separator</code> の代わりに <code>File.separatorChar=='\\' ? " \\\\" : File.separator</code> を使用できます。
2603 </p>
2604
2605
2606 <h3><a name="RE_POSSIBLE_UNINTENDED_PATTERN">RE: 正規表現のために使われている "." または "|" (RE_ POSSIBLE_UNINTENDED_PATTERN)</a></h3>
2607
2608
2609 <p>
2610 String 機能が呼び出されていて、"." または "|" が引数として正規表現を取るパラメータに渡されています。
2611 これは意図したことですか?
2612 たとえば
2613 </p>
2614 <ul>
2615 <li><code>s.replaceAll(".", "/")</code> は、すべての文字が '/' 文字に置換された String を返す</li>
2616 <li><code>s.split(".")</code> は、常に長さが0の String 配列を返す</li>
2617 <li><code>"ab|cd".replaceAll("|", "/")</code> は、<code>"/a/b/|/c/d/"</code> を返す </li>
2618 <li><code>"ab|cd".split("|")</code> は、6個の要素がある配列を返す: <code>[, a, b, |, c, d]</ code></li>
2619 </ul>
2620
2621
2622 <h3><a name="RV_01_TO_INT">RV: 0から1の乱数値は整数値0に丸められる (RV_01_TO_INT)</a></h3>
2623
2624
2625 <p>
2626 0から1の乱数値は整数値0に丸められます。
2627 おそらく整数に丸められる前に何か他のことによって乱数値を倍数にしたかったか、または <code>Random.nextInt(n)</code> メソッドを使い たかったのでしょう。
2628 </p>
2629
2630
2631 <h3><a name="RV_ABSOLUTE_VALUE_OF_HASHCODE">RV: 符号付き32ビットハッシュコードの絶対値を計算する間違った試み (RV_ABSOLUTE_VALUE_OF_HASHCODE)</a></h3>
2632
2633
2634 <p>
2635 このコードは、ハッシュコードを生成して絶対値を計算しています。
2636 ハッシュコードが <code>Integer.MIN_VALUE</code> なら結果は同様に負です (<code>Math.abs(Integer.MIN_ VALUE) == Integer.MIN_VALUE</code> なので)。
2637 </p>
2638 <p>
2639 文字列の2^32個に1個は <code>Integer.MIN_VALUE</code> のハッシュコードを持っていて、「polygenelubricants」 、「GydZG_」、「DESIGNING WORKHOUSES」が該当します。
2640 </p>
2641
2642
2643 <h3><a name="RV_ABSOLUTE_VALUE_OF_RANDOM_INT">RV: 符号付き整数の乱数の絶対値を計算する間違った試み (RV_A BSOLUTE_VALUE_OF_RANDOM_INT)</a></h3>
2644
2645
2646 <p>
2647 このコードは、符号付き整数の乱数を生成して絶対値を計算しています。
2648 乱数ジェネレータで返される数が <code>Integer.MIN_VALUE</code> なら結果は同様に負です (<code>Math.abs(Integ er.MIN_VALUE) == Integer.MIN_VALUE</code> なので)。
2649 (同じ問題は long 値でも同様に起きます)。
2650 </p>
2651
2652
2653 <h3><a name="RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE">RV: compareTo によって返され た特定の値のコードチェック (RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE)</a></h3>
2654
2655
2656 <p>
2657 このコードは、compareTo または compare メソッドを呼び出して、戻り値が特定の値(たとえば1または-1) なのか確かめています。
2658 これらのメソッドを呼び出すときは特定のゼロ以外の値ではなく、結果の符号だけをチェックするべきです。
2659 多数または大部分の compareTo と比較メソッドは-1、0または1を返しますが、いくつかは他の値を返します。
2660 </p>
2661
2662
2663 <h3><a name="RV_EXCEPTION_NOT_THROWN">RV: 作成した例外をスローするのではなく捨てている (RV_EXCEPTION_N OT_THROWN)</a></h3>
2664
2665
2666 <p>
2667 このコードは、例外 (またはエラー) オブジェクトを作成していますが、何もしていません。<br>
2668 たとえば以下のようなコードです。
2669 </p>
2670 <blockquote><pre>
2671 if (x &lt; 0) {
2672 new IllegalArgumentException("x must be nonnegative");
2673 }
2674 </pre></blockquote>
2675 <p>
2676 おそらくプログラマの意図は、作成した例外をスローすることでした。
2677 </p>
2678 <blockquote><pre>
2679 if (x &lt; 0) {
2680 throw new IllegalArgumentException("x must be nonnegative");
2681 }
2682 </pre></blockquote>
2683
2684
2685 <h3><a name="RV_RETURN_VALUE_IGNORED">RV: 戻り値を無視しているメソッド (RV_RETURN_VALUE_IGNORE D)</a></h3>
2686
2687
2688 <p>
2689 このメソッドの戻り値はチェックするべきです。
2690 この警告の共通の原因は、オブジェクトが更新されると思って不変オブジェクトのメソッドを呼び出すことです。<br>
2691 たとえば以下のようなコードです。
2692 </p>
2693 <blockquote><pre>
2694 String dateString = getHeaderField(name);
2695 dateString.trim();
2696 </pre></blockquote>
2697 <p>
2698 プログラマは、<code>trim</code> メソッドが <code>dateString</code> によって参照される String オブジェクトが更 新されると思っています。
2699 しかし、String オブジェクトは不変で、<code>trim</code> メソッドが新しい String オブジェクトを返すのに無視しています。
2700 このコードは、以下のように修正するべきです。
2701 </p>
2702 <blockquote><pre>
2703 String dateString = getHeaderField(name);
2704 dateString = dateString.trim();
2705 </pre></blockquote>
2706
2707
2708 <h3><a name="RpC_REPEATED_CONDITIONAL_TEST">RpC: 条件テストの繰り返し (RpC_REPEATED_CONDIT IONAL_TEST)</a></h3>
2709
2710
2711 <p>
2712 このコードには条件テストが2回、つまり、1つめの条件テストが正しいとき、2つめの条件テストが実行されます (たとえば、<code>x == 0 || x == 0</code>)。
2713 多分、2つめの条件テストは何か他のことを意図しています (たとえば、<code>x == 0 || y == 0</code>)。
2714 </p>
2715
2716
2717 <h3><a name="SA_FIELD_SELF_ASSIGNMENT">SA: フィールドの自己代入 (SA_FIELD_SELF_ASSIGNMENT) </a></h3>
2718
2719
2720 <p>
2721 このメソッドにはフィールドの自己代入があります。<br>
2722 たとえば以下のようなコードです。
2723 </p>
2724 <blockquote><pre>
2725 int x;
2726 public void foo() {
2727 x = x;
2728 }
2729 </pre></blockquote>
2730 <p>
2731 そのような代入は役に立たないので、論理エラーかタイプミスかもしれません。
2732 </p>
2733
2734
2735 <h3><a name="SA_FIELD_SELF_COMPARISON">SA: フィールドとそれ自身との自己比較 (SA_FIELD_SELF_COMPA RISON)</a></h3>
2736
2737
2738 <p>
2739 このメソッドは、フィールドをそれ自身と比較しています。
2740 論理エラーかタイプミスかもしれません。正しいものを比較していることを確認してください。
2741 </p>
2742
2743
2744 <h3><a name="SA_FIELD_SELF_COMPUTATION">SA: フィールドの無意味な自己演算 (たとえば、 x & x) (SA_FIE LD_SELF_COMPUTATION)</a></h3>
2745
2746
2747 <p>
2748 このメソッドは、フィールドと同じフィールドへの別の参照との無意味な計算を実行しています (たとえば、x &amp; x または x - x)。
2749 この計算の性質のため、演算は意味をなすとは思われないので、論理エラーかタイプミスかもしれません。
2750 計算をチェックしてください。
2751 </p>
2752
2753
2754 <h3><a name="SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD">SA: フィールドへの代入ではなくローカル変数へ の自己代入 (SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD)</a></h3>
2755
2756
2757 <p>
2758 このメソッドにはローカル変数の自己代入があり、ローカル変数とフィールドが同じ名前です。<br>
2759 たとえば以下のようなコードです。
2760 </p>
2761 <blockquote><pre>
2762 int foo;
2763 public void setFoo(int foo) {
2764 foo = foo;
2765 }
2766 </pre></blockquote>
2767 <p>
2768 そのような代入は役に立ちません。そうではなく、フィールドに代入するつもりでしたか?
2769 </p>
2770
2771
2772 <h3><a name="SA_LOCAL_SELF_COMPARISON">SA: ローカル変数とそれ自身との自己比較 (SA_LOCAL_SELF_COMP ARISON)</a></h3>
2773
2774
2775 <p>
2776 このメソッドは、ローカル変数をそれ自身と比較しています。論理エラーかタイプミスかもしれません。
2777 正しいものを比較していることを確認してください。
2778 </p>
2779
2780
2781 <h3><a name="SA_LOCAL_SELF_COMPUTATION">SA: 変数の無意味な自己演算 (たとえば、x & x) (SA_LOCAL_S ELF_COMPUTATION)</a></h3>
2782
2783
2784 <p>
2785 このメソッドは、ローカル変数と同じ変数への別の参照との無意味な計算を実行しています (たとえば、x &amp; x または x - x)。
2786 この計算の性質のため、演算は意味をなすとは思われないので、論理エラーかタイプミスかもしれません。
2787 計算をダブルチェックしてください。
2788 </p>
2789
2790
2791 <h3><a name="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH">SF: switch 文のフォールスルーのために格納 が無効になっている (SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH)</a></h3>
2792
2793
2794 <p>
2795 前の case で格納された値が switch 文のフォールスルーのためにここで上書きされています。
2796 前の case の終わりに break または return を入れるのを忘れた可能性があります。
2797 </p>
2798
2799
2800 <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>
2801
2802
2803 <p>
2804 前の case で格納された値が例外がスローされる場所で、switch 文のフォールスルーのためにここで失われています。
2805 前の case の終わりに break または return を入れるのを忘れた可能性があります。
2806 </p>
2807
2808
2809 <h3><a name="SIC_THREADLOCAL_DEADLY_EMBRACE">SIC: 非 static 内部クラスとスレッドローカルのデッドロック (SIC_THREADLOCAL_DEADLY_EMBRACE)</a></h3>
2810
2811
2812 <p>
2813 このクラスは内部クラスですが、おそらく static 内部クラスにすべきです。
2814 実際には内部クラスと外部クラスのスレッドローカルとの間にデッドロックの深刻な危険性があります。
2815 内部クラスが static でないので、外部クラスへの参照を保持します。
2816 スレッドローカルに内部クラスのインスタンスの参照があるなら、内部と外部のインスタンスの両方が到達可能になり、ガベージされません。
2817 </p>
2818
2819
2820 <h3><a name="SIO_SUPERFLUOUS_INSTANCEOF">SIO: instanceof 演算子を使用した不必要な型チェック (SIO_ SUPERFLUOUS_INSTANCEOF)</a></h3>
2821
2822
2823 <p>
2824 オブジェクトが要求する型であるかどうかにかかわらず、静的に判定される instanceof 演算子を使用して型チェックをしています。
2825 </p>
2826
2827
2828 <h3><a name="SQL_BAD_PREPARED_STATEMENT_ACCESS">SQL: インデックスが0で PreparedStatement にアクセスしようとしているメソッド (SQL_BAD_PREPARED_STATEMENT_ACCESS)</a></h3>
2829
2830
2831 <p>
2832 インデックスが0で、<code>PreparedStatement</code> の setXXX メソッドを呼び出しています。
2833 インデックスは1から開始するので、これは常に間違いです。
2834 </p>
2835
2836
2837 <h3><a name="SQL_BAD_RESULTSET_ACCESS">SQL: インデックスが0で ResultSet にアクセスしようとしているメソッ ド (SQL_BAD_RESULTSET_ACCESS)</a></h3>
2838
2839
2840 <p>
2841 インデックスが0で、<code>ResultSet</code> の getXXX、updateXXX メソッドを呼び出しています。
2842 <code>ResultSet</code> のインデックスは1から開始するので、これは常に間違いです。
2843 </p>
2844
2845
2846 <h3><a name="STI_INTERRUPTED_ON_CURRENTTHREAD">STI: interrupted メソッドを呼び出すために不要な currentThread メソッドを呼び出している (STI_INTERRUPTED_ON_CURRENTTHREAD)</a></h3>
2847
2848
2849 <p>
2850 このメソッドは、<code>interrupted</code> メソッドを呼び出すために <code>Thread.currentThread()</code > を呼び出しています。
2851 <code>interrupted</code> メソッドは static メソッドなので、<code>Thread.interrupted()</code> を使用するほうが単純明解です。
2852 </p>
2853
2854
2855 <h3><a name="STI_INTERRUPTED_ON_UNKNOWNTHREAD">STI: スレッドインスタンスで static Thread.in terrupted() を呼び出している (STI_INTERRUPTED_ON_UNKNOWNTHREAD)</a></h3>
2856
2857
2858 <p>
2859 このメソッドは、カレントスレッドでない Thread オブジェクトであるように見える Thread オブジェクトで <code>Thread.interrupt ed()</code> を呼び出しています。
2860 <code>interrupted</code> メソッドは static なので、作成者が意図したこととは異なるオブジェクトで呼び出されます。
2861 </p>
2862
2863
2864 <h3><a name="SE_METHOD_MUST_BE_PRIVATE">Se: 直列化機構のために private にしなければならないメソッド (SE _METHOD_MUST_BE_PRIVATE)</a></h3>
2865
2866
2867 <p>
2868 このクラスは、<code>Serializable</code> インタフェースを実装して、カスタム直列化/直列化復元のためのメソッドを定義しています。
2869 しかし、そのメソッドが private として宣言されていないので、直列化/直列化復元 API によって無視されます。
2870 </p>
2871
2872
2873 <h3><a name="SE_READ_RESOLVE_IS_STATIC">Se: readResolve メソッドが static メソッドとして宣言され ている (SE_READ_RESOLVE_IS_STATIC)</a></h3>
2874
2875
2876 <p>
2877 <code>readResolve</code> メソッドが直列化機構で認識されるためには static メソッドとして宣言してはいけません。
2878 </p>
2879
2880
2881 <h3><a name="TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED">TQ: 型修飾子でアノテーションされた値がその修 飾子を付けてはならない値を必要とする場所で使われている (TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED)</a></h3>
2882
2883
2884 <p>
2885 型修飾子でアノテートされた値がその修飾子を付けてはならない値を必要とする場所で使われています。
2886 </p>
2887 <p>
2888 より正確に、when=ALWAYS を指定した型修飾子でアノテートされた値が到達することが保証されているか同じ型修飾子で when=NEVER を指定する場所で 使用しています。
2889 </p>
2890 <p>
2891 たとえば、@NonNegative は型修飾子アノテーション @Negative(when=When.NEVER) の略称とします。
2892 以下のコードは、return 文が @NonNegative 値を要求するが @Negative としてマークされている値を受け取るのでこの警告を生成します。
2893 </p>
2894 <blockquote><pre>
2895 public @NonNegative Integer example(@Negative Integer value) {
2896 return value;
2897 }
2898 </pre></blockquote>
2899
2900
2901 <h3><a name="TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_QUALIFIERS">TQ: 互換性のない型修 飾子による比較値 (TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_QUALIFIERS)</a></h3>
2902
2903
2904 <p>
2905 型修飾子アノテーションを指定した値がその修飾子のない値と比較しています。
2906 </p>
2907 <p>
2908 より正確に、when=ALWAYS を指定した型修飾子でアノテートされた値が同じ型修飾子で when=NEVER を指定する値と比較しています。
2909 </p>
2910 <p>
2911 たとえば、@NonNegative は型修飾子アノテーション @Negative(when=When.NEVER) の略称とします。
2912 以下のコードは、return 文が @NonNegative 値を要求するが、@Negative としてマークされている値を受け取るのでこの警告を生成します。
2913 </p>
2914 <blockquote><pre>
2915 public boolean example(@Negative Integer value1, @NonNegative Integer value2) {
2916 return value1.equals(value2);
2917 }
2918 </pre></blockquote>
2919
2920
2921 <h3><a name="TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK">TQ: 型修飾子を付けていないかもしれない値がそ の型修飾子を必要とする方法で常に使われている (TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK)</a></h3>
2922
2923
2924 <p>
2925 型修飾子によって示された値のインスタンスではない可能性としてアノテートされた値です。
2926 値は、その型修飾子によって示された値を必要とする方法で使われることが保証されています。
2927 </p>
2928
2929
2930 <h3><a name="TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK">TQ: 型修飾子を付けているかもしれない値がその型 修飾子を禁止する方法で常に使われている (TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK)</a></h3>
2931
2932
2933 <p>
2934 型修飾子によって示された値のインスタンスである可能性としてアノテートされた値です。
2935 値は、その型修飾子によって示された値を禁止する方法で使われることが保証されています。
2936 </p>
2937
2938
2939 <h3><a name="TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED">TQ: 型修飾子でアノテートされていない値がその 修飾子が付けられた値を必要とする場所で使われている (TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED)</a></h3>
2940
2941
2942 <p>
2943 型修飾子でアノテートされていない値がその修飾子が付けられた値を必要とする場所で使われています。
2944 </p>
2945 <p>
2946 より正確に、when=NEVER を指定した型修飾子でアノテートされた値が同じ型修飾子で when=ALWAYS を指定する場所で使用しています。
2947 </p>
2948
2949
2950 <h3><a name="TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_REQUIRED">TQ: 型修飾子がない値が 修飾子を必要とする場所で使われている (TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_REQUIRED)</a></h 3>
2951
2952
2953 <p>
2954 値が型修飾子アノテーションを必要とする方法で使われています。型修飾子は厳密なので、ツールは適切なアノテーションを指定していない値を拒絶します。
2955 </p>
2956 <p>
2957 厳密なアノテーションを指定しているので値を型変換します。戻り値が厳密なアノテーションでアノテートされる同一性機能を定義してください。
2958 これは厳密な型修飾子アノテーションで非アノテート値を値に変える唯一の方法です。
2959 </p>
2960
2961
2962 <h3><a name="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS">UMAC: 呼び出し不可能なメソッドが無名クラス で定義されている (UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS)</a></h3>
2963
2964
2965 <p>
2966 この無名クラスは、直接呼び出されないスーパークラスのメソッドをオーバーライドしていないメソッドを定義しています。
2967 他のクラスのメソッドが無名クラスで宣言されたメソッドを直接呼び出せないので、このメソッドは呼び出し不可能だと思われます。
2968 メソッドは単にデッドコードであるかもしれません。しかし、メソッドがスーパークラスで宣言されるメソッドをオーバーライドすることを意図した可能性もあります。
2969 そして、タイプミスまたは他の誤りのためにメソッドは、実際には意図しているメソッドをオーバーライドしません。
2970 </p>
2971
2972
2973 <h3><a name="UR_UNINIT_READ">UR: コンストラクタで初期化されていないフィールドを読み出している (UR_UNINIT_READ) </a></h3>
2974
2975
2976 <p>
2977 このコンストラクタは、まだ値が代入されていないフィールドを読み出しています。
2978 多くの場合、プログラマがコンストラクタのパラメータの代わりに誤ってフィールドを使うときに起きます。
2979 </p>
2980
2981
2982 <h3><a name="UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR">UR: スーパークラスのコンストラクタから 呼び出されるメソッドで初期化されていないフィールドを読み出している (UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR) </a></h3>
2983
2984
2985 <p>
2986 このメソッドは、スーパークラスのコンストラクタで呼びされています。この時点では、クラスのフィールドはまだ初期化されていません。
2987 </p>
2988 <p>
2989 これはたくさんの具象クラスを作るためです。以下のクラスを検討してください。
2990 </p>
2991 <blockquote><pre>
2992 abstract class A {
2993 int hashCode;
2994 abstract Object getValue();
2995
2996 A() {
2997 hashCode = getValue().hashCode();
2998 }
2999 }
3000
3001 class B extends A {
3002 Object value;
3003
3004 B(Object v) {
3005 this.value = v;
3006 }
3007
3008 Object getValue() {
3009 return value;
3010 }
3011 }
3012 </pre></blockquote>
3013 <p>
3014 <code>B</code> が構築されるとき、<code>B</code> のコンストラクタが <code>value</code> に値を設定する前に、<c ode>A</code> クラスのコンストラクタが呼び出されます。
3015 したがって、<code>A</code> のコンストラクタが <code>getValue</code> を呼び出すとき、<code>value</code> の初期化されていない値が読み出されます。
3016 </p>
3017
3018
3019
3020 <h3><a name="DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY">USELESS_STRING: 名前のない配列で toString メソッドを呼び出している (DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY)</a></h3>
3021
3022
3023 <p>
3024 このコードは、無名の配列で <code>toString</code> メソッドを呼び出しています。「[C@16f0472」のようなかなり役に立たない結果を生成 します。
3025 配列のコンテンツを与え、読める文字列に変換するために <code>Arrays.toString()</code> を使用することを検討してください。<br>
3026 『Programming Puzzlers』の第3章、パズル12を参照してください。
3027 </p>
3028
3029
3030 <h3><a name="DMI_INVOKING_TOSTRING_ON_ARRAY">USELESS_STRING: 配列で toString メソッドを呼 び出している (DMI_INVOKING_TOSTRING_ON_ARRAY)</a></h3>
3031
3032
3033 <p>
3034 このコードは、配列で <code>toString</code> メソッドを呼び出しています。「[C@16f0472」のようなかなり役に立たない結果を生成します 。
3035 配列のコンテンツを与え、読める文字列に変換するために <code>Arrays.toString()</code> を使用することを検討してください。<br>
3036 『Programming Puzzlers』の第3章、パズル12を参照してください。
3037 </p>
3038
3039
3040 <h3><a name="VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY">USELESS_STRING: 書式文字列を使 用して役に立たない方法で配列をフォーマットしている (VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY)</a></h3>
3041
3042
3043 <p>
3044 書式文字列でフォーマットされている引数の1つは配列です。
3045 [I@304282 のように配列のコンテンツを表示しないかなり役に立たない書式を使用してフォーマットされます。
3046 フォーマットで扱う前に <code>Arrays.asList(...)</code> を使用して配列をラップすることを検討してください。
3047 </p>
3048
3049
3050 <h3><a name="UWF_NULL_FIELD">UwF: null に設定されるだけのフィールド (UWF_NULL_FIELD)</a></h3>
3051
3052
3053 <p>
3054 このフィールドに定数値 null を書き込みます。したがって、フィールドの読み出しは null を返します。
3055 誤りをチェックしてください。役に立たないなら除去してください。
3056 </p>
3057
3058
3059 <h3><a name="UWF_UNWRITTEN_FIELD">UwF: 書き込まれていないフィールド (UWF_UNWRITTEN_FIELD)</a>< /h3>
3060
3061
3062 <p>
3063 このフィールドは決して書き込まれません。このフィールドからの読み出しはデフォルト値を返します。
3064 誤りをチェックしてください (フィールドは初期化するべきでしたか?)。役に立たないなら除去してください。
3065 </p>
3066
3067
3068 <h3><a name="VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG">VA: 可変長引数を期待しているメソッドにプリ ミティブ型の配列を渡している (VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG)</a></h3>
3069
3070
3071 <p>
3072 このコードは可変長引数をとるメソッドにプリミティブ型の配列を渡しています。
3073 これはプリミティブ型の配列を保持するために長さが1の配列を作成してメソッドに渡します。
3074 </p>
3075
3076
3077 <h3><a name="LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE">LG: ロガーの変更は OpenJDK の弱参照が原因で潜 在的に失われる (LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)</a></h3>
3078
3079
3080 <p>
3081 OpenJDK は、潜在的非互換性を取り入れました。特に、<code>java.util.logging.Logger</code> は振る舞いが変更されていま す。
3082 強参照を使用する代わりに弱参照を内部的に使用しています。
3083 それは理にかなった変更ですが、残念ながらいくつかのコードは古い振る舞いに依存しています。
3084 ロガーの構成を変更するとき、ロガーへの参照を捨てます。
3085 つまり、ガベージコレクタはそのメモリを回収できます。それは、ロガーの構成が失われることを意味します。<br>
3086 たとえば、以下を検討してください。
3087 </p>
3088 <blockquote><pre>
3089 public static void initLogging() throws Exception {
3090 Logger logger = Logger.getLogger("edu.umd.cs");
3091 logger.addHandler(new FileHandler()); // ロガーの構成の変更
3092 logger.setUseParentHandlers(false); // 別のロガーの構成の変更
3093 }
3094 </pre></blockquote>
3095 <p>
3096 ロガーの参照は、メソッドの終わり (メソッドは脱出しません) で失われるので、
3097 <code>initLogging</code> の呼び出しの後でガベージコレクションの循環があるなら、ロガー構成は失われます (なぜなら Logger は弱参 照を保持するだけなので)。
3098 </p>
3099 <blockquote><pre>
3100 public static void main(String[] args) throws Exception {
3101 initLogging(); // ファイルハンドラーをロガーに追加する
3102 System.gc(); // ロガーの構成が失われる
3103 Logger.getLogger("edu.umd.cs").info("Some message"); // 期待したようにファイルに記録されません
3104 }
3105 </pre></blockquote>
3106 <p>
3107 Ulf Ochsenfahrt と Eric Fellheimer
3108 </p>
3109
3110
3111 <h3><a name="OBL_UNSATISFIED_OBLIGATION">OBL: ストリームやリソースのクリーンアップに失敗するかもしれないメソッド (OBL_UNSATISFIED_OBLIGATION)</a></h3>
3112
3113
3114 <p>
3115 このメソッドは、ストリーム、データベースオブジェクト、またはクリーンアップ操作を明示的に必要としている他のリソースのクリーンアップ (クローズする、片付ける) に失敗するかもしれません。
3116 </p>
3117 <p>
3118 一般的にメソッドがストリープや他のリソースを開いたなら、メソッドはストリームやリソースがメソッドが戻る前にクリーンアップされることを確認するために try/fi nally ブロックを使用するべきです。
3119 </p>
3120 <p>
3121 このバグパターンは、OS_OPEN_STREAM と ODR_OPEN_DATABASE_RESOURCE と基本的に同じですが異なる (そして、うまくいけばよ り良い) 静的解析技術に基づいています。
3122 私たちは、このバグパターンの有効性についてのフィードバックを得ることに関心があります。
3123 どちらかの方法でフィードバックを送ってください。
3124 </p>
3125 <ul>
3126 <li>send email to findbugs@cs.umd.edu</li>
3127 <li>file a bug report: <a href="http://findbugs.sourceforge.net/reportingBugs. html">http://findbugs.sourceforge.net/reportingBugs.html</a></li>
3128 </ul>
3129 <p>
3130 特に、このバグパターンの誤検出抑制探索法は詳細にわたって調整されていないので、誤検出についてのレポートは我々の助けになります。
3131 </p>
3132 <p>
3133 解析技術の説明は、Weimer と Necula による <i>Finding and Preventing Run-Time Error Handling M istakes</i> を参照してください。
3134 </p>
3135
3136
3137 <h3><a name="OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE">OBL: チェック例外でストリームやリソースのク リーンアップに失敗するかもしれないメソッド (OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE)</a></h3>
3138
3139
3140 <p>
3141 このメソッドは、ストリーム、データベースオブジェクト、またはクリーンアップ操作を明示的必要としている他のリソースのクリーンアップ (クローズする、片付ける) に 失敗するかもしれません。
3142 </p>
3143 <p>
3144 一般的にメソッドがストリープや他のリソースを開いたなら、メソッドはストリームやリソースがメソッドが戻る前にクリーンアップされることを確認するために try/fi nally ブロックを使用するべきです。
3145 </p>
3146 <p>
3147 このバグパターンは、OS_OPEN_STREAM と ODR_OPEN_DATABASE_RESOURCE と基本的に同じですが異なる (そして、うまくいけばよ り良い) 静的解析技術に基づいています。
3148 私たちは、このバグパターンの有効性についてのフィードバックを得ることに関心があります。
3149 どちらかの方法でフィードバックを送ってください。
3150 </p>
3151 <ul>
3152 <li>send email to findbugs@cs.umd.edu</li>
3153 <li>file a bug report: <a href="http://findbugs.sourceforge.net/reportingBugs. html">http://findbugs.sourceforge.net/reportingBugs.html</a></li>
3154 </ul>
3155 <p>
3156 特に、このバグパターンの誤検出抑制探索法は詳細にわたって調整されていないので、誤検出についてのレポートは我々の助けになります。
3157 </p>
3158 <p>
3159 解析技術の説明は、Weimer と Necula による <i>Finding and Preventing Run-Time Error Handling M istakes</i> を参照してください。
3160 </p>
3161
3162
3163 <h3><a name="DM_CONVERT_CASE">Dm: 呼び出したメソッドの Locale パラメータの使用を検討する (DM_CONVERT_CA SE)</a></h3>
3164
3165
3166 <p>
3167 文字列がプラットホームのデフォルトエンコーディングを使用して大文字、小文字に変換されています。
3168 国際文字で使われると不適切な変換になることがあります。
3169 </p>
3170 <ul>
3171 <li>String.toUpperCase(Locale l)</li>
3172 <li>String.toLowerCase(Locale l)</li>
3173 </ul>
3174
3175
3176 <h3><a name="DM_DEFAULT_ENCODING">Dm: デフォルトエンコーディングへの依存 (DM_DEFAULT_ENCODING)</a ></h3>
3177
3178
3179 <p>
3180 byte から String (または String から byte) への変換で、デフォルトプラットホームエンコーディングが適切だと仮定するメソッドの呼び出し を発見しました。
3181 これはアプリケーションの振る舞いがプラットホーム間で異なる原因となります。代替 API を使用して、文字セット名または Charset オブジェクトを明示的に指 定して下さい。
3182 </p>
3183
3184
3185 <h3><a name="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED">DP: doPrivileged ブロック内で 作成されるべきクラスローダ (DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED)</a></h3>
3186
3187
3188 <p>
3189 このコードはクラスローダを作成していますが、セキュリティ管理がインストールされるなら許可が必要です。
3190 このコードがセキュリティ許可がないコードによって呼び出されるなら、クラスローダの作成は doPrivileged ブロックの中で行う必要があります。
3191 </p>
3192
3193
3194 <h3><a name="DP_DO_INSIDE_DO_PRIVILEGED">DP: doPrivileged ブロック内で呼び出すべきメソッド (DP_D O_INSIDE_DO_PRIVILEGED)</a></h3>
3195
3196
3197 <p>
3198 このコードは、セキュリティ許可チェックが必要なメソッドを呼び出しています。
3199 このコードにセキュリティ許可が与えられるとしても、セキュリティ許可を持たないコードによって呼び出されるなら doPrivileged ブロックの中で呼び出す必要 があります。
3200 </p>
3201
3202
3203 <h3><a name="EI_EXPOSE_REP">EI: 可変オブジェクトへの参照を返すことによって内部表現を暴露するかもしれないメソッド (EI_EXP OSE_REP)</a></h3>
3204
3205
3206 <p>
3207 オブジェクトのフィールドに格納された可変オブジェクトの参照を返すと、オブジェクトの内部表現を暴露します。
3208 インスタンスが信頼できないコードによってアクセスされるなら、可変オブジェクトのチェックされていない変更がセキュリティや他の重要なプロパティを危うくするでしょう。
3209 何か違うことをする必要があります。オブジェクトの新しいコピーを返すことは、多くの状況でより良いアプローチです。
3210 </p>
3211
3212
3213 <h3><a name="EI_EXPOSE_REP2">EI2: 可変オブジェクトへの参照を取り込むことによって内部表現を暴露するかもしれないメソッド (EI _EXPOSE_REP2)</a></h3>
3214
3215
3216 <p>
3217 このコードは、オブジェクトの内部表現に外部の可変オブジェクトの参照を格納しています。
3218 インスタンスが信頼できないコードによってアクセスされるなら、可変オブジェクトのチェックされていない変更がセキュリティや他の重要なプロパティを危うくするでしょう。
3219 何か違うことをする必要があります。オブジェクトの新しいコピーを返すことは、多くの状況でより良いアプローチです。
3220 </p>
3221
3222
3223 <h3><a name="FI_PUBLIC_SHOULD_BE_PROTECTED">FI: ファイナライザは public ではなく protected に すべき (FI_PUBLIC_SHOULD_BE_PROTECTED)</a></h3>
3224
3225
3226 <p>
3227 このクラスの <code>finalize</code> メソッドは public ではなく、protected にすべきです。
3228 </p>
3229
3230
3231 <h3><a name="EI_EXPOSE_STATIC_REP2">MS: static フィールドに可変オブジェクトを格納することによって、内部の静的状態 を暴露するかもしれないメソッド (EI_EXPOSE_STATIC_REP2)</a></h3>
3232
3233
3234 <p>
3235 このコードは、static フィールドに外部の可変オブジェクトを格納しています。
3236 可変オブジェクトのチェックされていない変更がセキュリティや他の重要なプロパティを危うくするでしょう。
3237 何か違うことをする必要があります。オブジェクトのコピーを保存することは、多くの状況でより良いアプローチです。
3238 </p>
3239
3240
3241 <h3><a name="MS_CANNOT_BE_FINAL">MS: final でないフィールドは悪意のあるコードから保護できない (MS_CANNOT_ BE_FINAL)</a></h3>
3242
3243
3244 <p>
3245 この可変 static フィールドは悪意のあるコードや偶然別のパッケージによって変更できます。
3246 残念ながらこのような使い方は簡単に解決できません。
3247 </p>
3248
3249
3250 <h3><a name="MS_EXPOSE_REP">MS: 配列を返すことによって内部表現を暴露するかもしれない public static メソッド (M S_EXPOSE_REP)</a></h3>
3251
3252
3253 <p>
3254 public static メソッドは、クラスの 静的な状態の一部である配列の参照を返します。
3255 このメソッドを呼び出すどんなコードも、基底配列を自由に変更できます。
3256 解決策は、配列のコピーを返すことです。
3257 </p>
3258
3259
3260 <h3><a name="MS_FINAL_PKGPROTECT">MS: final かつパッケージプロテクテッドにすべきフィールド (MS_FINAL_PK GPROTECT)</a></h3>
3261
3262
3263 <p>
3264 この可変 static フィールドは悪意のあるコードや偶然別のパッケージによって変更できます。
3265 フィールドは、脆弱性を回避するために final および/またはパッケージプロテクテッドにします。
3266 </p>
3267
3268
3269 <h3><a name="MS_MUTABLE_ARRAY">MS: 可変配列のフィールド (MS_MUTABLE_ARRAY)</a></h3>
3270
3271
3272 <p>
3273 この final static フィールドは配列を参照しているので、悪意のあるコードや偶然別のパッケージによってアクセスできます。
3274 このコードは、配列のコンテンツを自由に変更できます。
3275 </p>
3276
3277
3278 <h3><a name="MS_MUTABLE_COLLECTION">MS: 可変コレクションのフィールド (MS_MUTABLE_COLLECTION)</ a></h3>
3279
3280
3281 <p>
3282 可変コレクションのインスタンスが final static フィールドに割り当てられています。
3283 したがって、 悪意のあるコードや偶然別のパッケージによって変更できます。
3284 脆弱性を避けるために Collections.unmodifiableSet/List/Map などでこのフィールドをラップすることを検討してください。
3285 </p>
3286
3287
3288 <h3><a name="MS_MUTABLE_COLLECTION_PKGPROTECT">MS: パッケージプロテクテッドにすべき可変コレクションのフィール ド (MS_MUTABLE_COLLECTION_PKGPROTECT)</a></h3>
3289
3290
3291 <p>
3292 可変コレクションのインスタンスが final static フィールドに割り当てられています。
3293 したがって、悪意のあるコードや偶然別のパッケージによって変更できます。
3294 フィールドは脆弱性を避けるためにパッケージプロテクテッドにできます。
3295 代わりに Collections.unmodifiableSet/List/Map などでこのフィールドをラップしても脆弱性を避けることができます。
3296 </p>
3297
3298
3299 <h3><a name="MS_MUTABLE_HASHTABLE">MS: 可変 Hashtable のフィールド (MS_MUTABLE_HASHTABLE )</a></h3>
3300
3301
3302 <p>
3303 この final static フィールドは Hashtable を参照しているので、悪意のあるコードや偶然別のパッケージによってアクセスできます。
3304 このコードは、Hashtable のコンテンツを自由に変更できます。
3305 </p>
3306
3307
3308 <h3><a name="MS_OOI_PKGPROTECT">MS: インタフェースから移動してパッケージプロテクテッドにすべきフィールド (MS_OOI_P KGPROTECT)</a></h3>
3309
3310
3311 <p>
3312 インタフェースに定義された final static フィールドが配列や Hashtable などの可変オブジェクトを参照しています。
3313 この可変オブジェクトは悪意のあるコードや偶然別のパッケージによって変更できます。
3314 これを解決するためにフィールドはクラスへ移動する必要があり、脆弱性を回避するためにパッケージプロテクテッドにします。
3315 </p>
3316
3317
3318 <h3><a name="MS_PKGPROTECT">MS: パッケージプロテクテッドにすべきフィールド (MS_PKGPROTECT)</a></h3>
3319
3320
3321 <p>
3322 この可変 static フィールドは悪意のあるコードや偶然別のパッケージによって変更できます。
3323 フィールドは、脆弱性を回避するためにパッケージプロテクテッドにします。
3324 </p>
3325
3326
3327 <h3><a name="MS_SHOULD_BE_FINAL">MS: final にすべきフィールド (MS_SHOULD_BE_FINAL)</a></h 3>
3328
3329
3330 <p>
3331 final でない public static フィールドは悪意のあるコードや偶然別のパッケージによって変更できます。
3332 フィールドは、脆弱性を回避するために final にします。
3333 </p>
3334
3335
3336 <h3><a name="MS_SHOULD_BE_REFACTORED_TO_BE_FINAL">MS: final でないフィールドはリファクタリングするべ き (MS_SHOULD_BE_REFACTORED_TO_BE_FINAL)</a></h3>
3337
3338
3339 <p>
3340 final でない public static フィールドは悪意のあるコードや偶然別のパッケージによって変更できます。
3341 フィールドは、脆弱性を回避するために final にします。
3342 しかしながら、スタティックイニシャライザには複数のフィールドへの書き込みがあるので、何らかのリファクタリングを必要とするでしょう。
3343 </p>
3344
3345
3346 <h3><a name="AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION">AT: 並行抽象の呼び出しシーケンス はアトミックではないかもしれない (AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION)</a></h3>
3347
3348
3349 <p>
3350 このコードには並行抽象化 (たとえば、並行ハッシュマップ) の呼び出しシーケンスがあります。
3351 これらの呼び出しは原子的に実行されません。
3352 </p>
3353
3354
3355 <h3><a name="DC_DOUBLECHECK">DC: フィールドのダブルチェックの可能性 (DC_DOUBLECHECK)</a></h3>
3356
3357
3358 <p>
3359 このメソッドにはダブルチェックロッキングのインスタンスがあるかもしれません。このイディオムは、Java のメモリモデルでは正しくありません。<br>
3360 詳細は、<a href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.h tml" >http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html</a> を参照してください。
3361 </p>
3362
3363
3364 <h3><a name="DC_PARTIALLY_CONSTRUCTED">DC: 部分的に初期化されたオブジェクトを暴露する可能性がある (DC_PARTI ALLY_CONSTRUCTED)</a></h3>
3365
3366
3367 <p>
3368 ダブルチェックロッキングと共に遅延初期化フィールドを使用するメソッドのようです。
3369 フィールドが正しく volatile として宣言される間にオブジェクトの内部構造がフィールドに割り当てられた後で変更される可能性があります。
3370 したがって、他のスレッドが部分的に初期化されたオブジェクトを見るかもしれません。
3371 </p>
3372 <p>
3373 この問題を直すために、最初にローカル変数をオブジェクトに格納して、完全に構築した後で volatile フィールドを保存することを考えてください。
3374 </p>
3375
3376
3377 <h3><a name="DL_SYNCHRONIZATION_ON_BOOLEAN">DL: Boolean の同期化 (DL_SYNCHRONIZATION _ON_BOOLEAN)</a></h3>
3378
3379
3380 <p>
3381 <code>Boolean</code> のようなボクシングされたプリミティブ型の定数で同期化しています。
3382 </p>
3383 <blockquote><pre>
3384 private static Boolean inited = Boolean.FALSE;
3385
3386 synchronized(inited) {
3387 if (!inited) {
3388 init();
3389 inited = Boolean.TRUE;
3390 }
3391 }
3392 </pre></blockquote>
3393 <p>
3394 一般には2つの <code>Boolean</code> オブジェクトだけが存在しています。
3395 このコードは他の無関係なコードと同じオブジェクトで同期化している可能性があるので、無応答やデッドロックの原因になります。
3396 </p>
3397
3398
3399 <h3><a name="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE">DL: デッドロックの原因になる可能性があるボクシングさ れたプリミティブ型の同期化 (DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE)</a></h3>
3400
3401
3402 <p>
3403 このコードは、Integer のようなボクシングされたプリミティブ型の定数で同期化しています。
3404 </p>
3405 <blockquote><pre>
3406 private static Integer count = 0;
3407
3408 synchronized(count) {
3409 count++;
3410 }
3411 </pre></blockquote>
3412 <p>
3413 <code>Integer</code> オブジェクトはキャッシュして共有できます。
3414 他の無関係なコードと同じオブジェクトで同期化している可能性があるので、無応答やデッドロックの原因になります。
3415 </p>
3416 <p>
3417 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> を参照してください。
3418 </p>
3419
3420
3421 <h3><a name="DL_SYNCHRONIZATION_ON_SHARED_CONSTANT">DL: 正準化した文字列の同期化 (DL_SYNCHRO NIZATION_ON_SHARED_CONSTANT)</a></h3>
3422
3423
3424 <p>
3425 このコードは、正準化した文字列で同期化しています。
3426 </p>
3427 <blockquote><pre>
3428 private static String LOCK = "LOCK";
3429
3430 synchronized(LOCK) {
3431 ...
3432 }
3433 </pre></blockquote>
3434 <p>
3435 文字列定数は正準化され、Java 仮想マシンによってロードされたすべてのクラス全体で共有されます。
3436 したがって、これは他のコードがロックしているかもしれない何かをロックしている可能性があります。
3437 これはブロッキングとデッドロックの振る舞いの診断を難しくして、とても奇妙な結果になる可能性があります。 <br>
3438 詳細は、<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> を参照してください。
3439 </p>
3440
3441
3442 <h3><a name="DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE">DL: ボクシングされたプリミティブ値 の同期化 (DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE)</a></h3>
3443
3444
3445 <p>
3446 このコードは、明らかに共有されていない <code>Integer</code> のようなボクシングされたプリミティブ型で同期化しています。
3447 </p>
3448 <blockquote><pre>
3449 private static final Integer fileLock = new Integer(1);
3450
3451 synchronized(fileLock) {
3452 .. do something ..
3453 }
3454 </pre></blockquote>
3455 <p>
3456 このコードは、 fileLock を以下のように宣言するとより良くなります。
3457 </p>
3458 <blockquote><pre>
3459 private static final Object fileLock = new Object();
3460 </pre></blockquote>
3461 <p>
3462 既存のコードとしては間違っていないかもしれないが、紛らわしいので将来リファクタリングするべきかもしれません。
3463 たとえば、IntelliJ の "Remove Boxing" のようなリファクタリングは Java 仮想マシンを通して共有される正準化された <code>In teger</code> オブジェクトを使用するように置き換えてしまい、非常に紛らわしい振る舞いと潜在的デッドロックの原因になります。
3464 </p>
3465
3466
3467 <h3><a name="DM_MONITOR_WAIT_ON_CONDITION">Dm: Condition で wait メソッドを呼び出している (DM _MONITOR_WAIT_ON_CONDITION)</a></h3>
3468
3469
3470 <p>
3471 このメソッドは、<code>java.util.concurrent.locks.Condition</code> オブジェクトで <code>wait</co de> メソッドを呼び出しています。
3472 <code>Condition</code> オブジェクトを待機させるためには <code>Condition</code> インタフェースで定義された <co de>await</code> メソッドを使用するべきです。
3473 </p>
3474
3475
3476 <h3><a name="DM_USELESS_THREAD">Dm: デフォルトの空の run メソッドを使用して作成されたスレッド (DM_USELESS_ THREAD)</a></h3>
3477
3478
3479 <p>
3480 このメソッドは、<code>Thread</code> クラスから派生した <code>run</code> メソッドを指定していないか、<code>Runna ble</code> オブジェクトを渡すことなく、スレッドを作成しています。
3481 このスレッドは、時間の無駄です。
3482 </p>
3483
3484
3485 <h3><a name="ESync_EMPTY_SYNC">ESync: 空の synchronized ブロック (ESync_EMPTY_SYNC)</a ></h3>
3486
3487
3488 <p>
3489 このコードには空の synchronized ブロックがあります。
3490 </p>
3491 <blockquote><pre>
3492 synchronized() {
3493 }
3494 </pre></blockquote>
3495 <p>
3496 空の synchronized ブロックは巧妙で正しく使用するのは困難です。
3497 空の synchronized ブロックはわざとらしくて決して良い解決策ではありません。
3498 </p>
3499
3500
3501 <h3><a name="IS2_INCONSISTENT_SYNC">IS: 一貫性のない同期化 (IS2_INCONSISTENT_SYNC)</a></h 3>
3502
3503
3504 <p>
3505 このクラスのフィールドは、同期化に関して一貫性なくアクセスされるように見えます。
3506 このバグレポートは、バグパターンディテクタが以下のように判断したことを示します。
3507 </p>
3508 <ul>
3509 <li>クラスは、ロックされたアクセスとアンロックされたアクセスが混在していて</li>
3510 <li>クラスは、javax.annotation.concurrent.NotThreadSafe としてアノテートされません</li>
3511 <li>少なくとも1つのロックされたアクセスがクラス自身のメソッドの1つによって実行され、</li>
3512 <li>読み出しの2倍の重み付けをした書き込みで、非同期フィールドのアクセス (読み出しと書き込み) 数がすべてのアクセスのわずか1/3</li>
3513 </ul>
3514 <p
3515 このバグパターンに合致する典型的なバグは、スレッドセーフを意図したクラスでメソッドを同期化させることを忘れていることです。
3516 </p>
3517 <p>
3518 ディテクタがどこでフィールドが同期化なしでアクセスされると信じていたかを示すコードの場所に「非同期アクセス」というラベルがついているノードを選択できます。
3519 </p>
3520 <p>
3521 不正確ないろいろな原因がこのディテクタにあることに注意してください。
3522 たとえば、ディテクタはロックを保持されるすべての状況を静的に検出できるわけではありません。
3523 また、ディテクタがロックされたアクセスとアンロックされたアクセスの区別が正確なときでも、問題のコードは依然として正しいかもしれません。
3524 </p>
3525
3526
3527 <h3><a name="IS_FIELD_NOT_GUARDED">IS: 並行アクセスに対してガードされていないフィールド (IS_FIELD_NOT_GU ARDED)</a></h3>
3528
3529
3530 <p>
3531 このフィールドは、net.jcip.annotations.GuardedBy または javax.annotation.concurrent.GuardedB y でアノテートされていますが、アノテーションに違反すると思われる方法でアクセスできます。
3532 </p>
3533
3534
3535 <h3><a name="JLM_JSR166_LOCK_MONITORENTER">JLM: Lock で同期化している (JLM_JSR166_LOCK_M ONITORENTER)</a></h3>
3536
3537
3538 <p>
3539 このメソッドは、<code>java.util.concurrent.locks.Lock</code> を実装したオブジェクトで同期化しています。
3540 そのようなオブジェクトは <code>synchronized (...)</code> 構文よりも <code>acquire()</code>/<code> release()</code> を使用してロックとロックの解除をします。
3541 </p>
3542
3543
3544 <h3><a name="JLM_JSR166_UTILCONCURRENT_MONITORENTER">JLM: java.util.concurrent の インスタンスで同期化している (JLM_JSR166_UTILCONCURRENT_MONITORENTER)</a></h3>
3545
3546
3547 <p>
3548 このメソッドは、java.util.concurrent パッケージのクラス (またはサブクラス) のインスタンスで同期化しています。
3549 これらのクラスのインスタンスは、<code>synchronized</code> の使用とは違う互換性のないそれら自身の並行制御メカニズムを持っています。
3550 たとえば、<code>AtomicBoolean</code> で同期しても、他のスレッドが <code>AtomicBoolean</code> を変更するの を防ぎません。
3551 </p>
3552 <p>
3553 そのようなコードは正しいかもしれないが、将来コードを維持しなければならない人々を混乱させるかもしれないので慎重にレビューし文書化するべきです、
3554 </p>
3555
3556
3557 <h3><a name="JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT">JLM: util.concurrent 抽象で モニタスタイルの wait メソッドを使用している (JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT)</a></h3>
3558
3559
3560 <p>
3561 このメソッドは、<code>await()</code> メソッド、<code>signal</code> メソッド、<code>signalAll</code > メソッドを提供するオブジェクト
3562 (たとえば、util.concurrent の Condition オブジェクト) で、<code>wait</code> メソッド、<code>notify< /code> メソッド、<code>notifyAll</code> メソッドを呼び出しています。
3563 これはおそらくあなたが望むことではありません。たとえそれを望むとしても、他の開発者が非常に紛らわしいことを理解して、設計を変更することを検討するべきです。
3564 </p>
3565
3566
3567 <h3><a name="LI_LAZY_INIT_STATIC">LI: static フィールドの間違った遅延初期化 (LI_LAZY_INIT_STATI C)</a></h3>
3568
3569
3570 <p>
3571 このメソッドにはvolatile でない static フィールドの非同期な遅延初期化があります。
3572 コンパイラやプロセッサが命令を並べ替えるかもしれないので、メソッドが複数のスレッドによって呼び出されるなら、
3573 スレッドは完全に初期化されたオブジェクトを見るとは保証されていません。
3574 フィールドにアクセスした際に、中途半端に初期化されたインスタンスが見えてしまう危険があります。
3575 この問題を修正するためにフィールドを volatile にできます。<br>
3576 詳細は、<a href="http://www.cs.umd.edu/~pugh/java/memoryModel/">Java Memory Model we b site</a> を参照してください。
3577 </p>
3578
3579
3580 <h3><a name="LI_LAZY_INIT_UPDATE_STATIC">LI: 更新される static フィールドの間違った遅延初期化 (LI_LA ZY_INIT_UPDATE_STATIC)</a></h3>
3581
3582
3583 <p>
3584 このメソッドにはstatic フィールドの非同期な遅延初期化があります。
3585 フィールドが設定された後で、その場所に格納されるオブジェクトはさらに更新されるかアクセスされます。
3586 それが設定されるとすぐに、フィールドを設定することは他のスレッドに見えます。
3587 フィールドを設定するさらなるアクセスがオブジェクトを初期化するのに役に立つなら、
3588 それが完全に初期化されるまでどんな他のスレッドも格納されたオブジェクトにアクセスするのを防がないかぎり、非常に深刻なマルチスレッドバグがあります。
3589 </p>
3590 <p>
3591 たとえメソッドが複数のスレッドによって決して呼び出されないと確信していても、
3592 それは、フィールドに設定している値が完全にデータを読み込まれるか初期化されるまで、 static フィールドを設定しないほうが良いかもしれません。
3593 </p>
3594
3595
3596 <h3><a name="ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD">ML: フィールドを同期化でガードしよう とする無駄な試み (ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD)</a></h3>
3597
3598
3599 <p>
3600 このメソッドは、フィールドの同時更新に対して同期化でガードしようとしています。しかし、フィールドをガードするとフィールドではなく、フィールドが参照するオブジェク トのロックを獲得します。
3601 これはあなたが必要とする相互排除ができないかもしれません。
3602 他のスレッドは (他の目的のための) 参照されたオブジェクトのロックを獲得するかもしれません。<br>
3603 このパターンの例は以下のようになります。
3604 </p>
3605 <blockquote><pre>
3606 private Long myNtfSeqNbrCounter = new Long(0);
3607 private Long getNotificationSequenceNumber() {
3608 Long result = null;
3609 synchronized(myNtfSeqNbrCounter) {
3610 result = new Long(myNtfSeqNbrCounter.longValue() + 1);
3611 myNtfSeqNbrCounter = new Long(result.longValue());
3612 }
3613 return result;
3614 }
3615 </pre></blockquote>
3616
3617
3618 <h3><a name="ML_SYNC_ON_UPDATED_FIELD">ML: 更新されるフィールドで同期化しているメソッド (ML_SYNC_ON_UP DATED_FIELD)</a></h3>
3619
3620
3621 <p>
3622 このメソッドは、可変フィールドから参照されたオブジェクトで同期化しています。
3623 異なるスレッドが異なるオブジェクトで同期化しているかもしれないので、有用な意味を持っている可能性が低いです。
3624 </p>
3625
3626
3627 <h3><a name="MSF_MUTABLE_SERVLET_FIELD">MSF: 可変サーブレットフィールド (MSF_MUTABLE_SERVLET_ FIELD)</a></h3>
3628
3629
3630 <p>
3631 Web サーバは、一般的にサーブレットや JSP クラスのインスタンスを1つだけ作成します (すなわち、シングルトンとして扱います)。
3632 複数のスレッドが複数同時のリクエストに応えるためにそのインスタンスでメソッドを呼び出します。
3633 したがって、一般に可変インスタンスフィールドは競合状態を作ります。
3634 </p>
3635
3636
3637 <h3><a name="MWN_MISMATCHED_NOTIFY">MWN: 不整合な notify メソッド (MWN_MISMATCHED_NOTIFY )</a></h3>
3638
3639
3640 <p>
3641 このメソッドは、オブジェクトで明らかにロックを保持することなく <code>Object.notify()</code> や <code>Object.noti fyAll()</code> を呼び出しています。
3642 保持されるロックがない状態で、<code>notify</code> メソッドや <code>notifyAll</code> メソッドを呼び出すことは、<co de>IllegalMonitorStateException</code> をスローすることになります。
3643 </p>
3644
3645
3646 <h3><a name="MWN_MISMATCHED_WAIT">MWN: 不整合な wait メソッド (MWN_MISMATCHED_WAIT)</a>< /h3>
3647
3648
3649 <p>
3650 このメソッドは、オブジェクトで明らかにロックを保持することなく、<code>Object.wait()</code> を呼び出しています。
3651 保持されるロックがない状態で、<code>wait</code> メソッドを呼び出すことは、<code>IllegalMonitorStateException </code> をスローすることになります。
3652 </p>
3653
3654
3655 <h3><a name="NN_NAKED_NOTIFY">NN: 裸の notify メソッド (NN_NAKED_NOTIFY)</a></h3>
3656
3657
3658 <p>
3659 <code>notify</code> メソッドまたは <code>notifyAll</code> メソッドへの呼び出しは可変オブジェクト状態にどんな (明ら かな) 付随的な変更ももたらされませんでした。
3660 一般的に別のスレッドが期待しているいくつかの条件が真になったので、モニタで <code>notify</code> メソッドが呼び出されます。
3661 しかしながら、意味がある条件のために両方のスレッドに見えるヒープオブジェクトを含まなければなりません。
3662 </p>
3663 <p>
3664 可変オブジェクトの状態変更が通知があるメソッドを呼び出したメソッドで起こったかもしれないので、このバグが必ずしもエラーを示すというわけではありません。
3665 </p>
3666
3667
3668 <h3><a name="NP_SYNC_AND_NULL_CHECK_FIELD">NP: 同じフィールドでの同期化と null チェック (NP_SYNC_ AND_NULL_CHECK_FIELD)</a></h3>
3669
3670
3671 <p>
3672 フィールドは同期化しているので、おそらく null ではないと思われます。
3673 null のフィールドを同期化すると NullPointerException がスローされるので、null チェックは無意味になります。
3674 別のフィールドで同期化したほうがよいです。
3675 </p>
3676
3677
3678 <h3><a name="NO_NOTIFY_NOT_NOTIFYALL">No: notifyAll メソッドではなく notify メソッドを使用している (NO_NOTIFY_NOT_NOTIFYALL)</a></h3>
3679
3680
3681 <p>
3682 このメソッドは、<code>notifyAll</code> メソッドではなく <code>notify</code> メソッドを呼び出しています。
3683 モニタが複数の条件のために多くの場合使われます。
3684 <code>notify</code> メソッドの呼び出しは1つのスレッドを起こすだけで起こされたスレッドは呼び出し元が満たした待機条件の1つではないかもしれな いことを意味しています。
3685 </p>
3686
3687
3688 <h3><a name="RS_READOBJECT_SYNC">RS: readObject メソッドを同期化しているクラス (RS_READOBJECT_S YNC)</a></h3>
3689
3690
3691 <p>
3692 この直列化可能クラスは同期化する <code>readObject</code> メソッド を定義していますが、
3693 直列化復元によって作成されるオブジェクトは1つのスレッドによってだけ到達可能です。
3694 したがって、<code>readObject</code> メソッドは同期化する必要がありません。
3695 <code>readObject</code> メソッドそのものが別のスレッドに見えるようになるオブジェクトの原因になっているなら非常に疑わしいコーディングスタ イルの例です。
3696 </p>
3697
3698
3699 <h3><a name="RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED">RV: putIfAbsent の戻り値は無視されて putIfAbsent に渡した値は再利用された (RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED)</a></h3>
3700
3701
3702 <p>
3703 <code>putIfAbsent</code> メソッドは、1つの値が与えられたキー (非存在が成功するかどうかの第一の値) と関連することを確認するために使 われます。
3704 戻り値を無視して中で渡される値への参照を保持するなら、マップのキーと関連する1つではない値を保持する危険性を冒します。
3705 どれを使用するかが重要であり、マップに格納できないものを使うとプログラムは誤った振る舞いをします。
3706 </p>
3707
3708
3709 <h3><a name="RU_INVOKE_RUN">Ru: スレッドで run メソッドを呼び出している (RU_INVOKE_RUN)</a></h3>
3710
3711
3712 <p>
3713 このメソッドは、スレッドで 明示的に <code>run</code> メソッドを呼び出しています。
3714 一般的にクラスは新しいスレッドで自己の <code>run</code> メソッドを呼び出してもらうために <code>Runnable</code> インタフ ェースを実装します。
3715 その場合は、<code>Thread.start()</code> を呼び出すのが正しいです。
3716 </p>
3717
3718
3719 <h3><a name="SC_START_IN_CTOR">SC: Thread.start() を呼び出しているコンストラクタ (SC_START_IN_C TOR)</a></h3>
3720
3721
3722 <p>
3723 コンストラクタがスレッドを開始しています。クラスが拡張され、サブクラスが作られるなら間違っていそうです。
3724 なぜなら、サブクラスのコンストラクタでスレッドが開始される前にスーパークラスのスレッドが開始されてしまうためです。
3725 </p>
3726
3727
3728 <h3><a name="SP_SPIN_ON_FIELD">SP: スピンロックをしているメソッド (SP_SPIN_ON_FIELD)</a></h3>
3729
3730
3731 <p>
3732 このメソッドは、フィールドを読み出すループで回り続けます。
3733 コンパイラがフィールドの読み出しをループの外に出すかもしれません。コードを無限ループに変えます。
3734 正しい同期化 (wait/notify を呼び出すように含む) を使うようにクラスを変更するべきです。
3735 </p>
3736
3737
3738 <h3><a name="STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE">STCAL: static Calendar の呼 び出し (STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE)</a></h3>
3739
3740
3741 <p>
3742 たとえ JavaDoc にそれに関する手がかりがないとしても、Calendar はマルチスレッドでの使用は本質的に安全ではありません。
3743 ディテクタは、static フィールドから得られた Calendar のインスタンスの呼び出しを発見しました。
3744 これは疑わしく見えます。
3745 詳細については、<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> を参照してください。
3746 </p>
3747
3748
3749 <h3><a name="STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE">STCAL: static DateForm at の呼び出し (STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE)</a></h3>
3750
3751
3752 <p>
3753 JavaDoc に書かれているように DateFormat はマルチスレッドでの使用は本質的に安全ではありません。
3754 ディテクタは、static フィールドから得られた DateFormat のインスタンスの呼び出しを発見しました。
3755 これは疑わしく見えます。
3756 詳細については、<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> を参照してください。
3757 </p>
3758
3759
3760 <h3><a name="STCAL_STATIC_CALENDAR_INSTANCE">STCAL: static Calendar フィールド (STCAL _STATIC_CALENDAR_INSTANCE)</a></h3>
3761
3762
3763 <p>
3764 たとえ JavaDoc にそれに関する手がかりがないとしても、Calendar はマルチスレッドでの使用は本質的に安全でありません。
3765 正しい同期化をしないでスレッド境界の向こうで1つのインスタンスを共有することは、アプリケーションの誤動作になります。
3766 JDK 5.0に比べて JDK 1.4 のほうが問題が表面化するように思われ、おそらく sun.util.calendar.BaseCalendar.getCa lendarDateFromFixedDate() の ArrayIndexOutOfBoundsExceptions や IndexOutOfBoundsEx ceptions がランダムに発生します。
3767 直列化問題も経験するかもしれません。インスタンスフィールドを使用することを推奨します。<br>
3768 詳細については、<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> を参照してください。
3769 </p>
3770
3771
3772 <h3><a name="STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE">STCAL: static DateFormat (STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE)</a></h3>
3773
3774
3775 <p>
3776 JavaDoc に書かれているように DateFormat はマルチスレッドでの使用は本質的に安全ではありません。
3777 正しい同期化をしないでスレッド境界の向こうで1つのインスタンスを共有することは、アプリケーションの誤動作になります。
3778 JDK 5.0に比べて JDK 1.4 のほうが問題が表面化するように思われ、おそらく sun.util.calendar.BaseCalendar.getCa lendarDateFromFixedDate() の ArrayIndexOutOfBoundsExceptions や IndexOutOfBoundsEx ceptions がランダムに発生します。
3779 直列化問題も経験するかもしれません。インスタンスフィールドを使用することを推奨します。<br>
3780 詳細については、<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> を参照してください。
3781 </p>
3782
3783
3784 <h3><a name="SWL_SLEEP_WITH_LOCK_HELD">SWL: ロックを保持して Thread.sleep() を呼び出しているメソッド (SWL_SLEEP_WITH_LOCK_HELD)</a></h3>
3785
3786
3787 <p>
3788 このメソッドは、ロックを保持して、<code>Thread.sleep()</code> を呼び出しています。
3789 他のスレッドがロックを獲得するために待機しているかもしれないので、ひどい性能とスケーラビリティ、またはデッドロックの原因になるかもしれません。
3790 ロックで <code>wait</code> メソッドを呼び出すことはかなり良い考えで、ロックを解除して他のスレッドが実行するのを許可します。
3791 </p>
3792
3793
3794 <h3><a name="TLW_TWO_LOCK_WAIT">TLW: 2つ以上のロックを保持して wait メソッドを呼び出している (TLW_TWO_LO CK_WAIT)</a></h3>
3795
3796
3797 <p>
3798 2つ以上のロックを保持して、モニタで待機させるとデッドロックを引き起こすことがあります。
3799 <code>wait</code> メソッドを呼び出すと、待機しているオブジェクトのロックを解除するだけで、その他のロックは解除しません。
3800 これは必ずしもバグではありませんが厳密に調べる価値があります。
3801 </p>
3802
3803
3804 <h3><a name="UG_SYNC_SET_UNSYNC_GET">UG: 同期化していない get メソッド、同期化している set メソッド (UG_ SYNC_SET_UNSYNC_GET)</a></h3>
3805
3806
3807 <p>
3808 このクラスには類似した名前の get メソッドと set メソッドがあり、set メソッドは同期化していて、get メソッドは同期化していません。
3809 get メソッドの呼び出し元がオブジェクトの一貫した状態を必ずしも見るというわけではないので、実行時に間違った振る舞いの原因になることがあります。
3810 get メソッドは同期化するべきです。
3811 </p>
3812
3813
3814 <h3><a name="UL_UNRELEASED_LOCK">UL: すべての経路でロックが解除されないメソッド (UL_UNRELEASED_LOCK)< /a></h3>
3815
3816
3817 <p>
3818 このメソッドは、JSR-166(<code>java.util.concurrent</code>) のロックを獲得していますが、メソッドからのすべての経路で解 除していません。
3819 一般的に JSR-166のロックを使用するための正しいイディオムは以下のようになります。
3820 </p>
3821 <blockquote><pre>
3822 Lock l = ...;
3823 l.lock();
3824 try {
3825 // do something
3826 } finally {
3827 l.unlock();
3828 }
3829 </pre></blockquote>
3830
3831
3832 <h3><a name="UL_UNRELEASED_LOCK_EXCEPTION_PATH">UL: すべての例外経路でロックが解除されないメソッド (UL_ UNRELEASED_LOCK_EXCEPTION_PATH)</a></h3>
3833
3834
3835 <p>
3836 このメソッドは、JSR-166(<code>java.util.concurrent</code>) のロックを獲得していますが、メソッドからのすべての例外経路 で解除していません。
3837 一般的に JSR-166のロックを使用するための正しいイディオムは以下のようになります。
3838 </p>
3839 <blockquote><pre>
3840 Lock l = ...;
3841 l.lock();
3842 try {
3843 // do something
3844 } finally {
3845 l.unlock();
3846 }
3847 </pre></blockquote>
3848
3849
3850 <h3><a name="UW_UNCOND_WAIT">UW: wait メソッドの無条件呼び出し (UW_UNCOND_WAIT)</a></h3>
3851
3852
3853 <p>
3854 このメソッドには条件制御フローによってガードされない <code>java.lang.Object.wait()</code> の呼び出しがあります。
3855 このコードは、<code>wait</code> メソッドを呼び出す前に待機するつもりだった条件が既に満たされていないことを確かめるべきです。
3856 どんな前の通知も無視されます。
3857 </p>
3858
3859
3860 <h3><a name="VO_VOLATILE_INCREMENT">VO: volatile フィールドへのインクリメントはアトミックではない (VO_VO LATILE_INCREMENT)</a></h3>
3861
3862
3863 <p>
3864 このコードは、volatile フィールドをインクリメントしています。
3865 volatile フィールドのインクリメントはアトミックではありません。
3866 複数のスレッドが同時にフィールドをインクリメントすると、インクリメントが失われる可能性があります。
3867 </p>
3868
3869
3870 <h3><a name="VO_VOLATILE_REFERENCE_TO_ARRAY">VO: 配列への volatile 参照は、配列要素を volatil e として扱わない (VO_VOLATILE_REFERENCE_TO_ARRAY)</a></h3>
3871
3872
3873 <p>
3874 配列に volatile 参照を宣言していますが、あなたが望むものではないかもしれません。
3875 配列への volatile 参照は、配列への参照の読み出し、書き込みは volatile として扱われますが、配列要素は volatile として扱われません。
3876 配列要素を volatile として扱いたいのであれば、J2SE 5.0で提供された java.util.concurrent パッケージのアトミック配列クラス を使用する必要があります。
3877 </p>
3878
3879
3880 <h3><a name="WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL">WL: クラスリテラルではなく getCla ss で同期化している (WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL)</a></h3>
3881
3882
3883 <p>
3884 このインスタンスメソッドは、<code>this.getClass()</code> で同期化しています。
3885 このクラスがサブクラス化されるなら、サブクラスはおそらく意図したことではないサブクラスのためにクラスオブジェクトで同期化します。
3886 たとえば、<code>java.awt.Label</code> の以下のコードを検討してください。
3887 </p>
3888 <blockquote><pre>
3889 private static final String base = "label";
3890 private static int nameCounter = 0;
3891
3892 String constructComponentName() {
3893 synchronized (getClass()) {
3894 return base + nameCounter++;
3895 }
3896 }
3897 </pre></blockquote>
3898 <p>
3899 <code>Label</code> のサブクラスは同じサブクラスで同期化しません。データレースを生じさせます。
3900 代わりに、このコードは、<code>Label.class</code> で同期化するべきです。
3901 </p>
3902 <blockquote><pre>
3903 private static final String base = "label";
3904 private static int nameCounter = 0;
3905
3906 String constructComponentName() {
3907 synchronized (Label.class) {
3908 return base + nameCounter++;
3909 }
3910 }
3911 </pre></blockquote>
3912 <p>
3913 Jason Mehrens によって寄贈されたバグパターン
3914 </p>
3915
3916
3917 <h3><a name="WS_WRITEOBJECT_SYNC">WS: writeObject メソッドは同期化しているがその他のメソッドは同期化していない クラス (WS_WRITEOBJECT_SYNC)</a></h3>
3918
3919
3920 <p>
3921 このクラスには同期化している <code>writeObject</code> メソッドがあります。
3922 しかしながら、クラスのその他のメソッドは同期化していません。
3923 </p>
3924
3925
3926 <h3><a name="WA_AWAIT_NOT_IN_LOOP">Wa: Condition.await() がループの中にない (WA_AWAIT_NOT _IN_LOOP)</a></h3>
3927
3928
3929 <p>
3930 このメソッドは、ループの中にない <code>java.util.concurrent.await()</code> (またはそのバリエーション) を呼び出して います。
3931 オブジェクトが複数の条件のために使われるなら、呼び出し元が待機するつもりだった条件は実際には発生しないかもしれません。
3932 </p>
3933
3934
3935 <h3><a name="WA_NOT_IN_LOOP">Wa: wait メソッドがループの中にない (WA_NOT_IN_LOOP)</a></h3>
3936
3937
3938 <p>
3939 このメソッドは、ループの中にない <code>java.lang.Object.wait()</code> を呼び出しています。
3940 モニタが複数の条件のために使われるなら、呼び出し元が待機するつもりだった条件は実際には発生しないかもしれません。
3941 </p>
3942
3943
3944 <h3><a name="BX_BOXING_IMMEDIATELY_UNBOXED">Bx: プリミティブ値がボクシングされて、すぐにアンボクシングされる ( BX_BOXING_IMMEDIATELY_UNBOXED)</a></h3>
3945
3946
3947 <p>
3948 プリミティブ値がボクシングされて、すぐにアンボクシングされます。
3949 おそらくアンボクシングされた値が必要な場所で手動でボクシングをしているためです。
3950 その結果、コンパイラにボクシングの機能を取り消すことを強制しています。
3951 </p>
3952
3953
3954 <h3><a name="BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION">Bx: プリミティブ値がプリミテ ィブ型の型変換をするためにボクシングされて、アンボクシングされる (BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERC ION)</a></h3>
3955
3956
3957 <p>
3958 プリミティブ値がコンストラクタでボクシングされて、すぐに異なるプリミティブ型に変換されます (たとえば <code>new Double(d).intValue ()</code>)。
3959 直接プリミティブ型の型変換を実行してください (たとえば <code>(int) d</code>)。
3960 </p>
3961
3962
3963 <h3><a name="BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR">Bx: プリミティブ値が3項演算子のためにア ンボクシングされて、型変換される (BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR)</a></h3>
3964
3965
3966 <p>
3967 ラップされたプリミティブ値は、3項演算子 (<code> b ? e1 : e2</code>) の評価の一部として、別のプリミティブ型にアンボクシングされて変 換されます。
3968 Java 言語仕様では、<code>e1</code> と <code>e2</code> がラップされた数値なら値はアンボクシングされ、共通の型へと変換/型変 換されます
3969 (たとえば、<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> に変換) されます)。
3970 JLS セクション15.25を参照してください。
3971 </p>
3972
3973
3974 <h3><a name="BX_UNBOXING_IMMEDIATELY_REBOXED">Bx: ボクシングされた値がアンボクシングされて、すぐに再ボクシング される (BX_UNBOXING_IMMEDIATELY_REBOXED)</a></h3>
3975
3976
3977 <p>
3978 ボクシングされた値がアンボクシングされて、すぐに再ボクシングされます。
3979 </p>
3980
3981
3982 <h3><a name="DM_BOXED_PRIMITIVE_FOR_COMPARE">Bx: プリミティブが比較でボクシングされている (DM_BOXED_ PRIMITIVE_FOR_COMPARE)</a></h3>
3983
3984
3985 <p>
3986 ボクシングされたプリミティブが単に compareTo メソッドを呼び出すために作られています。
3987 直接プリミティブで働く static compare メソッド (double と float は Java 1.4から、他のプリミティブ型は Java 1.7 から) を使うほうがより効率的です。
3988 </p>
3989
3990
3991 <h3><a name="DM_BOXED_PRIMITIVE_FOR_PARSING">Bx: ボクシング/アンボクシングはプリミティブを解析する (DM_B OXED_PRIMITIVE_FOR_PARSING)</a></h3>
3992
3993
3994 <p>
3995 ボックス化されたプリミティブは、String から生成されていて、アンボックス化されたプリミティブ値を抽出します。
3996 static parseXXX メソッドを呼び出す方が効率的です。
3997 </p>
3998
3999
4000 <h3><a name="DM_BOXED_PRIMITIVE_TOSTRING">Bx: toString メソッドを呼び出すためにプリミティブ型のラッパクラ スのインスタンスを作成している (DM_BOXED_PRIMITIVE_TOSTRING)</a></h3>
4001
4002
4003 <p>
4004 <code>toString</code> メソッドを呼び出すためにプリミティブ型のラッパクラスのインスタンスを作成しています。
4005 それよりもプリミティブ値を引数にとる static な <code>toString</code> メソッドを使用したほうが効率的です。
4006 </p>
4007 <table>
4008 <tr><th>置換前</th><th>置換後</th></tr>
4009 <tr><td>new Integer(1).toString()</td><td>Integer.toString(1)</td></tr>
4010 <tr><td>new Long(1).toString()</td><td>Long.toString(1)</td></tr>
4011 <tr><td>new Float(1.0).toString()</td><td>Float.toString(1.0)</td></tr>
4012 <tr><td>new Double(1.0).toString()</td><td>Double.toString(1.0)</td></tr>
4013 <tr><td>new Byte(1).toString()</td><td>Byte.toString(1)</td></tr>
4014 <tr><td>new Short(1).toString()</td><td>Short.toString(1)</td></tr>
4015 <tr><td>new Boolean(true).toString()</td><td>Boolean.toString(true)</td></tr>
4016 </table>
4017
4018
4019 <h3><a name="DM_FP_NUMBER_CTOR">Bx: 効率が悪い浮動小数点 Number コンストラクタを呼び出しているメソッド (DM_FP _NUMBER_CTOR)</a></h3>
4020
4021
4022 <p>
4023 <code>new Double(double)</code> の使用は、常に新しいブジェクトになることが保証されています。
4024 これに対して、<code>Double.valueOf(double)</code> は、コンパイラ、クラスライブラリ、Java 仮想マシンで値がキャッシュされ ます。
4025 キャッシュに格納された値を使用することはインスタンス生成を回避し、コードはより高速になります。
4026 </p>
4027 <p>
4028 クラスが J2SE 5.0より前の Java 仮想マシンとの互換性が不要なら、オートボクシングか <code>Double</code>、<code>Float </code> の <code>valueOf</code> メソッドを使用してください。
4029 </p>
4030
4031
4032 <h3><a name="DM_NUMBER_CTOR">Bx: 効率が悪い Number コンストラクタを呼び出しているメソッド (DM_NUMBER_CTO R)</a></h3>
4033
4034
4035 <p>
4036 <code>new Integer(int)</code> の使用は、常に新しいブジェクトになることが保証されています。
4037 これに対して、<code>Integer.valueOf(int)</code> は、コンパイラ、クラスライブラリ、Java 仮想マシンで値がキャッシュされます 。
4038 キャッシュに格納された値を使用することはインスタンスの作成を回避し、コードはより高速になります。
4039 </p>
4040 <p>
4041 -128から127までの値は対応するキャッシュされたインスタンスを持つことが保証されています。
4042 そして、<code>valueOf</code> メソッドの使用は、コンストラクタを使用するより約3.5倍高速です。
4043 定数範囲外の値は、両方のスタイルの性能は同じです。
4044 </p>
4045 <p>
4046 クラスが J2SE 5.0より前の Java 仮想マシンとの互換性が不要なら、<code>Long</code>、<code>Integer</code>、<c ode>Short</code>、<code>Character</code>、<code>Byte</code> のインスタンスを作成するときは、オートボクシ ングか <code>valueOf</code> メソッドを使用してください。
4047 </p>
4048
4049
4050 <h3><a name="DMI_BLOCKING_METHODS_ON_URL">Dm: URL の equals メソッドと hashCode メソッドはブ ロックする (DMI_BLOCKING_METHODS_ON_URL)</a></h3>
4051
4052
4053 <p>
4054 URL の <code>equals</code> メソッドと <code>hashCode</code> メソッドは、ドメイン名の解決を行うので、ひどい性能に なる可能性があります。<br>
4055 詳細は、<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>
4056 その代わりに <code>java.net.URI</code> を使用することを検討してください。
4057 </p>
4058
4059
4060 <h3><a name="DMI_COLLECTION_OF_URLS">Dm: URL の Map や Set はひどい性能になる (DMI_COLLECTI ON_OF_URLS)</a></h3>
4061
4062
4063 <p>
4064 このメソッドまたはフィールドは、URL の <code>Map</code> か <code>Set</code> を使用しています。
4065 URL の <code>equals</code> と <code>hashCode</code> は、ドメイン名の解決を行うので、ひどい性能になります。<br >
4066 詳細は、<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>
4067 その代わりに <code>java.net.URI</code> を使用することを検討してください。
4068 </p>
4069
4070
4071 <h3><a name="DM_BOOLEAN_CTOR">Dm: 効率が悪い Boolean コンストラクタを呼び出しているメソッド (DM_BOOLEAN_ CTOR)</a></h3>
4072
4073
4074 <p>
4075 <code>java.lang.Boolean</code> の新しいインスタンスを作成するとメモリを浪費します。
4076 <code>Boolean</code> オブジェクトは不変で、2つの有用な値 (<code>Boolean.TRUE</code> と <code>Boole an.FALSE</code>) があります。
4077 その代わりに <code>Boolean.valueOf</code> メソッド (または J2SE 5.0 のオートボクシング) を使用して <code>Bo olean</code> オブジェクトを作成してください。
4078 </p>
4079
4080
4081 <h3><a name="DM_GC">Dm: 明示的なガベージコレクション (DM_GC)</a></h3>
4082
4083
4084 <p>
4085 明示的にガベージコレクションを呼び出しています。ベンチマークの特定の用途を除いて非常に疑わしいです。
4086 </p>
4087 <p>
4088 過去に、<code>close</code> メソッドや <code>finalize</code> メソッドでガベージコレクタを明示的に呼び出していた状況は、 巨大なパフォーマンスブラックホールの原因となりました。
4089 ガベージコレクションは高くつきます。何百、何千ものガベージコレクションを強制する状況は、システムの停滞をもたらすでしょう。
4090 </p>
4091
4092
4093 <h3><a name="DM_NEW_FOR_GETCLASS">Dm: クラスオブジェクトを得るためだけにインスタンスを作成しているメソッド (DM_NEW _FOR_GETCLASS)</a></h3>
4094
4095
4096 <p>
4097 メソッドは、クラスオブジェクトを得るためにインスタンスを生成して <code>getClass</code> メソッドを呼び出しています。
4098 クラスリテラル (<code>Foo.class</code>) を使うほうが簡単です。
4099 </p>
4100
4101
4102 <h3><a name="DM_NEXTINT_VIA_NEXTDOUBLE">Dm: 整数の乱数を生成するためには nextDouble メソッド ではなく nextInt メソッドを使用する (DM_NEXTINT_VIA_NEXTDOUBLE)</a></h3>
4103
4104
4105 <p>
4106 <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> を使用します。
4107 </p>
4108 <p>
4109 <code>nextInt</code> メソッドへの引数は整数でなければなりません。
4110 たとえば、-99から0までの乱数を生成したいなら、<code>-r.nextInt(100)</code> を使用してください。
4111 </p>
4112
4113
4114 <h3><a name="DM_STRING_CTOR">Dm: 効率が悪い new String(String) コンストラクタを呼び出しているメソッド (D M_STRING_CTOR)</a></h3>
4115
4116
4117 <p>
4118 <code>new String(String)</code> コンストラクタの使用はメモリを浪費します。
4119 そのようにして構築されたオブジェクトと パラメータとして渡された <code>String</code> は機能的に区別がつかないからです。
4120 引数の <code>String</code> をそのまま使用してください。
4121 </p>
4122
4123
4124 <h3><a name="DM_STRING_TOSTRING">Dm: String の toString メソッドを呼び出しているメソッド (DM_STRI NG_TOSTRING)</a></h3>
4125
4126
4127 <p>
4128 <code>String.toString()</code> を呼び出すのは冗長です。<code>String</code> を使用してください。
4129 </p>
4130
4131
4132 <h3><a name="DM_STRING_VOID_CTOR">Dm: 効率が悪い new String() コンストラクタを呼び出しているメソッド (DM _STRING_VOID_CTOR)</a></h3>
4133
4134
4135 <p>
4136 引数がないコンストラクタを使用して、新しい <code>java.lang.String()</code> オブジェクトを作成するとメモリを浪費します。
4137 そのようにして作成されたオブジェクトと空の文字列定数 <code>""</code> は機能的に区別がつかないからです。
4138 Javaは、同一の文字列定数が同じ <code>String</code> オブジェクトによって表されることを保証します。
4139 したがって、直接空の文字列定数を使用するべきです。
4140 </p>
4141
4142
4143 <h3><a name="HSC_HUGE_SHARED_STRING_CONSTANT">HSC: 複数のクラスファイルにわたって複製されている巨大な文字列定 数 (HSC_HUGE_SHARED_STRING_CONSTANT)</a></h3>
4144
4145
4146 <p>
4147 巨大な文字列定数が複数のクラスファイルにわたって複製されています。
4148 final フィールドが文字列定数で初期化され、Java 言語によって他のクラスからの final フィールドへのすべての参照がクラスファイルにインライン化され るからです。
4149 </p>
4150 <p>
4151 JDK はこのバグを解決してサイズを1MB減らすことができました。<br>
4152 詳細は、<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6447475">JDK bug 6447475</a> を参照してください。
4153 </p>
4154
4155
4156 <h3><a name="SBSC_USE_STRINGBUFFER_CONCATENATION">SBSC: ループの中で + を使用して文字列を連結している メソッド (SBSC_USE_STRINGBUFFER_CONCATENATION)</a></h3>
4157
4158
4159 <p>
4160 このメソッドは、ループの中で + を使用して <code>String</code> を構築していると思われます。
4161 各々の繰り返しにおいて、<code>String</code> は <code>StringBuffer</code>/<code>StringBuilder< /code> に変換、追加され、<code>String</code> へ変換されます。
4162 各々の繰り返しで文字列が再コピーされ、増大すると繰り返しの数で二次コストの原因になる可能性があります。
4163 </p>
4164 <p>
4165 <code>StringBuffer</code> (または J2SE 5.0の <code>StringBuilder</code>) を明示的に使うとより良 い性能を得られます。
4166 </p>
4167 <p>
4168 たとえば、
4169 </p>
4170 <blockquote><pre>
4171 // This is bad
4172 String s = "";
4173 for (int i = 0; i &lt; field.length; ++i) {
4174 s = s + field[i];
4175 }
4176
4177 // This is better
4178 StringBuffer buf = new StringBuffer();
4179 for (int i = 0; i &lt; field.length; ++i) {
4180 buf.append(field[i]);
4181 }
4182 String s = buf.toString();
4183 </pre></blockquote>
4184
4185
4186 <h3><a name="SIC_INNER_SHOULD_BE_STATIC">SIC: static 内部クラスにすべき (SIC_INNER_SHOULD _BE_STATIC)</a></h3>
4187
4188
4189 <p>
4190 このクラスは内部クラスなのにそれを作成したオブジェクトへの埋め込まれた参照を使用していません。
4191 この参照はより大きなクラスのインスタンスを作成して、必要以上に作成オブジェクトへの参照を存続しておくことがあります。
4192 できれば、クラスは static にすべきです。
4193 </p>
4194
4195
4196 <h3><a name="SIC_INNER_SHOULD_BE_STATIC_ANON">SIC: 名前付き static 内部クラスにリファクタリングできる かもしれない (SIC_INNER_SHOULD_BE_STATIC_ANON)</a></h3>
4197
4198
4199 <p>
4200 このクラスは内部クラスなのにそれを作成したオブジェクトへの埋め込まれた参照を使用していません。
4201 この参照はより大きなクラスのインスタンスを作成して、必要以上に作成オブジェクトへの参照を存続しておくことがあります。
4202 できれば、クラスは static 内部クラスにすべきです。
4203 無名内部クラスは static にできないので、名前付き内部クラスにリファクタリングする必要があります。
4204 </p>
4205
4206
4207 <h3><a name="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS">SIC: static 内部クラスにリファクタリングでき るかもしれない (SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS)</a></h3>
4208
4209
4210 <p>
4211 このクラスは内部クラスなのにそれを作成したオブジェクトへの埋め込まれた参照を使用していません。
4212 この参照はより大きなクラスのインスタンスを作成して、必要以上に長く作成オブジェクトへの参照を存続しておくかもしれません。
4213 できれば、クラスは static 内部クラスにすべきです。
4214 外部オブジェクトへの参照が内部クラスのインスタンスを構築する間必要なので内部クラスのコンストラクタに外部インスタンスへの参照を渡すようにリファクタリングする必要 があります。
4215 </p>
4216
4217
4218 <h3><a name="SS_SHOULD_BE_STATIC">SS: 読み出されないフィールド (SS_SHOULD_BE_STATIC)</a></h3 >
4219
4220
4221 <p>
4222 このクラスにはコンパイル時に静的な値に初期化されるインスタンス final フィールドがあります。
4223 static フィールドにすることを検討してください。
4224 </p>
4225
4226
4227 <h3><a name="UM_UNNECESSARY_MATH">UM: 定数値で Math クラスの static メソッドを呼び出しているメソッド (UM _UNNECESSARY_MATH)</a></h3>
4228
4229
4230 <p>
4231 このメソッドは、定数値で <code>java.lang.Math</code> の static メソッドを呼び出しています。
4232 このメソッドの結果は静的に判定でき、より高速で、ときには定数を使用するほうがより正確です。<br>
4233 検出されるメソッドは、以下のとおりです。
4234 </p>
4235 <table>
4236 <tr>
4237 <th>メソッド</th> <th>パラメータ</th>
4238 </tr>
4239 <tr>
4240 <td>abs</td> <td>-any-</td>
4241 </tr>
4242 <tr>
4243 <td>acos</td> <td>0.0 or 1.0</td>
4244 </tr>
4245 <tr>
4246 <td>asin</td> <td>0.0 or 1.0</td>
4247 </tr>
4248 <tr>
4249 <td>atan</td> <td>0.0 or 1.0</td>
4250 </tr>
4251 <tr>
4252 <td>atan2</td> <td>0.0</td>
4253 </tr>
4254 <tr>
4255 <td>cbrt</td> <td>0.0 or 1.0</td>
4256 </tr>
4257 <tr>
4258 <td>ceil</td> <td>-any-</td>
4259 </tr>
4260 <tr>
4261 <td>cos</td> <td>0.0</td>
4262 </tr>
4263 <tr>
4264 <td>cosh</td> <td>0.0</td>
4265 </tr>
4266 <tr>
4267 <td>exp</td> <td>0.0 or 1.0</td>
4268 </tr>
4269 <tr>
4270 <td>expm1</td> <td>0.0</td>
4271 </tr>
4272 <tr>
4273 <td>floor</td> <td>-any-</td>
4274 </tr>
4275 <tr>
4276 <td>log</td> <td>0.0 or 1.0</td>
4277 </tr>
4278 <tr>
4279 <td>log10</td> <td>0.0 or 1.0</td>
4280 </tr>
4281 <tr>
4282 <td>rint</td> <td>-any-</td>
4283 </tr>
4284 <tr>
4285 <td>round</td> <td>-any-</td>
4286 </tr>
4287 <tr>
4288 <td>sin</td> <td>0.0</td>
4289 </tr>
4290 <tr>
4291 <td>sinh</td> <td>0.0</td>
4292 </tr>
4293 <tr>
4294 <td>sqrt</td> <td>0.0 or 1.0</td>
4295 </tr>
4296 <tr>
4297 <td>tan</td> <td>0.0</td>
4298 </tr>
4299 <tr>
4300 <td>tanh</td> <td>0.0</td>
4301 </tr>
4302 <tr>
4303 <td>toDegrees</td> <td>0.0 or 1.0</td>
4304 </tr>
4305 <tr>
4306 <td>toRadians</td> <td>0.0</td>
4307 </tr>
4308 </table>
4309
4310
4311 <h3><a name="UPM_UNCALLED_PRIVATE_METHOD">UPM: private メソッドは決して呼び出されない (UPM_UNCA LLED_PRIVATE_METHOD)</a></h3>
4312
4313
4314 <p>
4315 この private メソッドは、決して呼び出されません。
4316 メソッドがリフレクションによって呼び出されるかもしれないが、決して使われないなら除去するべきです。
4317 </p>
4318
4319
4320 <h3><a name="URF_UNREAD_FIELD">UrF: 読み出されないフィールド (URF_UNREAD_FIELD)</a></h3>
4321
4322
4323 <p>
4324 このフィールドは決して読み出されません。クラスから除去することを検討してください。
4325 </p>
4326
4327
4328 <h3><a name="UUF_UNUSED_FIELD">UuF: 未使用のフィールド (UUF_UNUSED_FIELD)</a></h3>
4329
4330
4331 <p>
4332 このフィールドは決して使われません。クラスから除去することを検討してください。
4333 </p>
4334
4335
4336 <h3><a name="WMI_WRONG_MAP_ITERATOR">WMI: entrySet イテレータではなく効率が悪い keySet イテレータを使 用している (WMI_WRONG_MAP_ITERATOR)</a></h3>
4337
4338
4339 <p>
4340 このメソッドは、keySet イテレータから取り出されたキーを使用して、マップエントリの値にアクセスしています。
4341 Map の entrySet イテレータを使用したほうが <code>Map.get(key)</code> ルックアップを回避するのでより効率的です。
4342 </p>
4343
4344
4345 <h3><a name="DMI_CONSTANT_DB_PASSWORD">Dm: ハードコードされた定数データベースパスワード (DMI_CONSTANT_ DB_PASSWORD)</a></h3>
4346
4347
4348 <p>
4349 このコードは、ハードコードされた定数パスワードを使用してデータベース接続を作成しています。
4350 ソースコードかコンパイルされたコードへアクセスできる人なら誰でも簡単にパスワードを知ることができてしまいます。
4351 </p>
4352
4353
4354 <h3><a name="DMI_EMPTY_DB_PASSWORD">Dm: 空のデータベースパスワード (DMI_EMPTY_DB_PASSWORD)</a ></h3>
4355
4356
4357 <p>
4358 このコードは、空白または空のパスワードを使用してデータベース接続を作成しています。
4359 これはデータベースがパスワードによって保護されていないことを示しています。
4360 </p>
4361
4362
4363 <h3><a name="HRS_REQUEST_PARAMETER_TO_COOKIE">HRS: 信頼できない入力から形成された HTTP cookie ( HRS_REQUEST_PARAMETER_TO_COOKIE)</a></h3>
4364
4365
4366 <p>
4367 このコードは信頼できない HTTP パラメータを使用して HTTP クッキーを構築しています。
4368 このクッキーが HTTP レスポンスに追加されるなら、HRS(HTTP レスポンススプリッティング) 脆弱性を可能にします。<br>
4369 詳細は、<a href="http://en.wikipedia.org/wiki/HTTP_response_splitting">http://en.wik ipedia.org/wiki/HTTP_response_splitting</a> を参照してください。
4370 </p>
4371 <p>
4372 FindBugs は、HRS の最も露骨で自明なケースだけを探します。
4373 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。
4374 HRS を心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。
4375 </p>
4376
4377
4378 <h3><a name="HRS_REQUEST_PARAMETER_TO_HTTP_HEADER">HRS: HTTP レスポンススプリッティング脆弱性 (H RS_REQUEST_PARAMETER_TO_HTTP_HEADER)</a></h3>
4379
4380
4381 <p>
4382 このコードは、HTTP ヘッダに HTTP パラメータを直接書き込んでいます。これは HRS(HTTP レスポンススプリッティング) 脆弱性を可能にします。<b r>
4383 詳細は、<a href="http://en.wikipedia.org/wiki/HTTP_response_splitting">http://en.wik ipedia.org/wiki/HTTP_response_splitting</a> を参照してください。
4384 </p>
4385 <p>
4386 FindBugs は、HRS の最も露骨で自明なケースだけを探します。
4387 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。
4388 HRS を心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。
4389 </p>
4390
4391
4392 <h3><a name="PT_ABSOLUTE_PATH_TRAVERSAL">PT: サーブレットの絶対パストラバーサル (PT_ABSOLUTE_PATH _TRAVERSAL)</a></h3>
4393
4394
4395 <p>
4396 ソフトウェアは、制限されたディレクトリ内にあるべきパス名を構築するためにHTTPリクエストのパラメータを使いますが、パラメータはそのディレクトリの外にある場所に 解決できる「/abs/path」のような絶対パスシーケンスを適切に無効にしていません。
4397 詳細は、<a href="http://cwe.mitre.org/data/definitions/36.html">http://cwe.mitre.org /data/definitions/36.html</a> を参照してください。
4398 </p>
4399 <p>
4400 FindBugs は、相対パストラバーサルの最も露骨で自明なケースだけを探します。
4401 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。
4402 相対パストラバーサルを心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。
4403 </p>
4404
4405
4406 <h3><a name="PT_RELATIVE_PATH_TRAVERSAL">PT: サーブレットの相対パストラバーサル (PT_RELATIVE_PATH _TRAVERSAL)</a></h3>
4407
4408
4409 <p>
4410 ソフトウェアは、制限されたディレクトリ内にあるべきパス名を構築するためにHTTPリクエストのパラメータを使いますが、パラメータはそのディレクトリの外にある場所に 解決できる「..」のようなシーケンスを適切に無効にしていません。
4411 詳細は、<a href="http://cwe.mitre.org/data/definitions/23.html">http://cwe.mitre.org /data/definitions/23.html</a> を参照してください。
4412 </p>
4413 <p>
4414 FindBugs は、相対パストラバーサルの最も露骨で自明なケースだけを探します。
4415 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。
4416 相対パストラバーサルを心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。
4417 </p>
4418
4419
4420 <h3><a name="SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE">SQL: SQL の Statement の e xecute または addBatch メソッドに定数でない文字列を渡している (SQL_NONCONSTANT_STRING_PASSED_TO_EXECUT E)</a></h3>
4421
4422
4423 <p>
4424 このメソッドは、動的に生成されるように思われる文字列で、 SQL 文 の <code>execute</code> または <code>addBatch</co de> メソッドを呼び出しています。
4425 その代わりに <code>PreparedStatement</code> を使用することを検討してください。
4426 効率的で、SQL インジェクション攻撃に強いです。
4427 </p>
4428
4429
4430 <h3><a name="SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING">SQL: Prep aredStatement が定数でない文字列から生成されている (SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONST ANT_STRING)</a></h3>
4431
4432
4433 <p>
4434 このコードは、定数でない文字列から SQL の <code>PreparedStatement</code> を作成しています。
4435 ユーザからのチェックされていない汚染されたデータがこの文字列を作る際に使われるなら、<code>PreparedStatement</code> で予想外で望ま しくない何かをするために SQL インジェクションが使われる可能性があります。
4436 </p>
4437
4438
4439 <h3><a name="XSS_REQUEST_PARAMETER_TO_JSP_WRITER">XSS: 反射型クロスサイトスクリプティング脆弱性がある J SP (XSS_REQUEST_PARAMETER_TO_JSP_WRITER)</a></h3>
4440
4441
4442 <p>
4443 このコードは、JSP の出力に HTTP パラメータを直接書き込んでいます。これは XSS(クロスサイトスクリプティング) 脆弱性を可能にします。<br>
4444 詳細は、<a href="http://en.wikipedia.org/wiki/Cross-site_scripting">http://en.wikipe dia.org/wiki/Cross-site_scripting</a> を参照してください。
4445 </p>
4446 <p>
4447 FindBugs は、XSS の最も露骨で自明なケースだけを探します。
4448 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。
4449 XSS に関して心配しているなら商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。
4450 </p>
4451
4452
4453 <h3><a name="XSS_REQUEST_PARAMETER_TO_SEND_ERROR">XSS: 反射型クロスサイトスクリプティング脆弱性がエラーペ ージにあるサーブレット (XSS_REQUEST_PARAMETER_TO_SEND_ERROR)</a></h3>
4454
4455
4456 <p>
4457 このコードは、サーブレットのエラーページに <code>HttpServletResponse.sendError</code> を使用して HTTP パラメー タを直接書き込んでいます。
4458 信頼できない入力を返すことは反射型 XSS(クロスサイトスクリプティング) 脆弱性を可能にします。<br>
4459 詳細は、<a href="http://en.wikipedia.org/wiki/Cross-site_scripting">http://en.wikipe dia.org/wiki/Cross-site_scripting</a> を参照してください。
4460 </p>
4461 <p>
4462 FindBugs は、XSS の最も露骨で自明なケースだけを探します。
4463 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。
4464 XSS を心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。
4465 </p>
4466
4467
4468 <h3><a name="XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER">XSS: 反射型クロスサイトスクリプティング脆弱性が あるサーブレット (XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER)</a></h3>
4469
4470
4471 <p>
4472 このコードは、サーブレットの出力に HTTP パラメータを直接書き込んでいます。これは反射型 XSS(クロスサイトスクリプティング) 脆弱性を可能にします。<b r>
4473 詳細は、<a href="http://en.wikipedia.org/wiki/Cross-site_scripting">http://en.wikipe dia.org/wiki/Cross-site_scripting</a> を参照してください。
4474 </p>
4475 <p>
4476 FindBugs は、XSS の最も露骨で自明なケースだけを探します。
4477 FindBugs が何かを発見したならほぼ間違いなく FindBugs が報告しないより多くの脆弱性があるでしょう。
4478 XSS を心配するなら、商用の静的解析ツールかペネトレーションテストツールの使用を真剣に検討するべきです。
4479 </p>
4480
4481
4482 <h3><a name="BC_BAD_CAST_TO_ABSTRACT_COLLECTION">BC: 抽象コレクションへの疑わしいキャスト (BC_BAD_ CAST_TO_ABSTRACT_COLLECTION)</a></h3>
4483
4484
4485 <p>
4486 このコードは、Collection を抽象コレクションにキャストしています (たとえば <code>List</code>、<code>Set</code>、< code>Map</code>)。
4487 オブジェクトがキャストする型であるということが保証されていることを確認してください。
4488 必要とするコレクションの反復処理ができるなら Set または List にキャストする必要はありません。
4489 </p>
4490
4491
4492 <h3><a name="BC_BAD_CAST_TO_CONCRETE_COLLECTION">BC: 具象コレクションへの疑わしいキャスト (BC_BAD_ CAST_TO_CONCRETE_COLLECTION)</a></h3>
4493
4494
4495 <p>
4496 このコードは抽象コレクション (たとえば、Collection、List、Set) を特定の具象実装 (たとえば、ArrayList、HashSet) にキャス トしています。
4497 これは正しくないかもしれません。そして、将来の時点で他の具象実装への切り替えをとても困難にするので、脆弱なコードになるかもしれません。
4498 そうするための特別な理由がないかぎり抽象コレクションクラスを使用してください。
4499 </p>
4500
4501
4502 <h3><a name="BC_UNCONFIRMED_CAST">BC: 未チェック/未確認のキャスト (BC_UNCONFIRMED_CAST)</a></ h3>
4503
4504
4505 <p>
4506 このキャストはチェックされていません。すべての型のインスタンスをキャストする型へキャストできるわけではありません。
4507 プログラムのロジックがこのキャストが失敗しないことを確実に確認してください。
4508 </p>
4509
4510
4511 <h3><a name="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE">BC: メソッドからの戻り値の未チェック/未確認のキャスト (BC_UNCONFIRMED_CAST_OF_RETURN_VALUE)</a></h3>
4512
4513
4514 <p>
4515 このコードは、メソッドの戻り値の未確認のキャストを実行しています。
4516 コードは、キャストが安全であることが保証されるようにメソッドを呼び出しているかもしれませんが、FindBugs はキャストが安全であることを検証できません。
4517 プログラムのロジックがこのキャストが失敗しないことを確実に確認してください。
4518 </p>
4519
4520
4521 <h3><a name="BC_VACUOUS_INSTANCEOF">BC: 常に true を返す instanceof (BC_VACUOUS_INSTA NCEOF)</a></h3>
4522
4523
4524 <p>
4525 この instanceof は常に true を返します (テストしている値が null でないかぎり)。
4526 これは安全で、誤解や論理エラーを指摘していないことを確認してください。
4527 本当に null なのか値をテストしたいなら、多分、instanceof ではなく null テストをしたほうが良く、より明確になります。
4528 </p>
4529
4530
4531 <h3><a name="ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT">BSHIFT: 符号なし右シフトを short/by te にキャストしている (ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT)</a></h3>
4532
4533
4534 <p>
4535 このコードは、符号なしキャストの実行結果を short または byte にキャストしています。結果の上位ビットは捨てられます。
4536 上位ビットが捨てられるので、符号付きと符号なし右シフト (シフトのサイズによって) との違いがないかもしれません。
4537 </p>
4538
4539
4540 <h3><a name="CI_CONFUSED_INHERITANCE">CI: final なクラスが protected フィールドを宣言している (CI _CONFUSED_INHERITANCE)</a></h3>
4541
4542
4543 <p>
4544 このクラスは、final と宣言されていますが、フィールドは protected と宣言されています。
4545 クラスは fainal なので派生できません。、protected の使用は紛らわしいです。
4546 フィールドのためのアクセス修飾子は、フィールドの真の用途を表すため、 private か public に変更するべきです。
4547 </p>
4548
4549
4550 <h3><a name="DB_DUPLICATE_BRANCHES">DB: 2つの分岐のために同じコードを使用しているメソッド (DB_DUPLICATE_ BRANCHES)</a></h3>
4551
4552
4553 <p>
4554 このメソッドは、条件分岐の2つの分岐を実装するために同じコードを使用しています。これがコーディングミスではないことを確認してください。
4555 </p>
4556
4557
4558 <h3><a name="DB_DUPLICATE_SWITCH_CLAUSES">DB: switch 文の2つの case のために同じコードを使用している メソッド (DB_DUPLICATE_SWITCH_CLAUSES)</a></h3>
4559
4560
4561 <p>
4562 このメソッドは、switch 文の2つの case を実装するために同じコードを使用しています。
4563 複製コードの case かもしれないし、コーディングミスかもしれません。
4564 </p>
4565
4566
4567 <h3><a name="DLS_DEAD_LOCAL_STORE">DLS: ローカル変数への無効な代入 (DLS_DEAD_LOCAL_STORE)</a> </h3>
4568
4569
4570 <p>
4571 この命令はローカル変数に値を代入していますが、値は読み出されないか以降の命令でも使われません。
4572 多くの場合、計算された値が決して使われないので、これは誤りを示します。
4573 </p>
4574 <p>
4575 Sun の javac コンパイラが final なローカル変数のためにしばしば無効な格納を生成することに注意してください。
4576 FindBugs は、バイトコードベースのツールなので誤検出をなくす簡単な方法がありません。
4577 </p>
4578
4579
4580 <h3><a name="DLS_DEAD_LOCAL_STORE_IN_RETURN">DLS: return 文に役に立たない代入がある (DLS_DEAD _LOCAL_STORE_IN_RETURN)</a></h3>
4581
4582
4583 <p>
4584 この文は、return 文でローカル変数に代入をしています。この代入は効果がありません。
4585 この文が正しいことを確かめてください。
4586 </p>
4587
4588
4589 <h3><a name="DLS_DEAD_LOCAL_STORE_OF_NULL">DLS: ローカル変数への無効な null 代入 (DLS_DEAD_LO CAL_STORE_OF_NULL)</a></h3>
4590
4591
4592 <p>
4593 このコードはローカル変数に null を代入していますが代入された値は読み出されていません。
4594 この代入はガベージコレクタを手伝うために導入されたのかもしれませんが、Java SE 6 ではもはや必要とされないか有用ではありません。
4595 </p>
4596
4597
4598 <h3><a name="DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD">DLS: フィールドを遮るローカル変数への無効な代入 (DLS _DEAD_LOCAL_STORE_SHADOWS_FIELD)</a></h3>
4599
4600
4601 <p>
4602 この命令は、ローカル変数に値を代入していますが、値は読み出されないか以降の命令でも使われません。
4603 多くの場合、計算された値が決して使われないので、これは誤りを示します。
4604 フィールドがローカル変数と同じ名前です。そうではなく、フィールドに代入するつもりでしたか?
4605 </p>
4606
4607
4608 <h3><a name="DMI_HARDCODED_ABSOLUTE_FILENAME">DMI: ハードコードされた絶対パス名への参照がある (DMI_HA RDCODED_ABSOLUTE_FILENAME)</a></h3>
4609
4610
4611 <p>
4612 このコードは、ハードコードされた絶対パス名を使用して File オブジェクトを構築しています (たとえば <code>new File("/home/danny c/workspace/j2ee/src/share/com/sun/enterprise/deployment");</code>)。
4613 </p>
4614
4615
4616 <h3><a name="DMI_NONSERIALIZABLE_OBJECT_WRITTEN">DMI: ObjectOutput に書き込まれる非直列化可能 オブジェクト (DMI_NONSERIALIZABLE_OBJECT_WRITTEN)</a></h3>
4617
4618
4619 <p>
4620 このコードは、<code>ObjectOutput.writeObject</code> に非直列化可能オブジェクトを渡していると思われます。
4621 このオブジェクトが本当に非直列化可能なら、エラーを招きます。
4622 </p>
4623
4624
4625 <h3><a name="DMI_USELESS_SUBSTRING">DMI: substring(0) の呼び出しは元の値を返す (DMI_USELESS_ SUBSTRING)</a></h3>
4626
4627
4628 <p>
4629 このコードは、文字列で <code>substring(0)</code> を呼び出していますが、元の値を返します。
4630 </p>
4631
4632
4633 <h3><a name="DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED">Dm: Thread オブジェクトが Runna ble が期待されているところに渡されている (DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED)</a></h3>
4634
4635
4636 <p>
4637 Threadオブジェクトが Runnable が期待されているメソッドへのパラメータとして渡されています。
4638 これはかなり異常で、論理エラーを示すか、予想外の振る舞いの原因になることがあります。
4639 </p>
4640
4641
4642 <h3><a name="EQ_DOESNT_OVERRIDE_EQUALS">Eq: スーパークラスの equals メソッドをオーバーライドしていないクラス (EQ_DOESNT_OVERRIDE_EQUALS)</a></h3>
4643
4644
4645 <p>
4646 このクラスは、<code>equals</code> メソッドを定義しているクラスを拡張してフィールドを追加していますが、<code>equals</code> メソッドを定義していません。
4647 したがって、このクラスのインスタンスの等価性は、サブクラスと追加されたフィールドの同一性を無視します。
4648 これが意図したことで、しかも、<code>equals</code> メソッドをオーバーライドする必要がないことを確実にしてください。
4649 たとえ <code>equals</code> メソッドをオーバーライドする必要がないとしても、サブクラスのための <code>equals</code> メソ ッドが <code>super.equals(o)</code> を呼び出して結果を返すという事実を実証するためにいずれにしろ、<code>equals</co de> メソッドをオーバーライドすることを検討してください。
4650 </p>
4651
4652
4653 <h3><a name="EQ_UNUSUAL">Eq: 異常な equals メソッド (EQ_UNUSUAL)</a></h3>
4654
4655
4656 <p>
4657 このクラスの <code>equals</code> メソッドは、引数の型が <code>this</code> オブジェクトの型と互換性があるこをチェックする ために我々が認識しているパターンで何もしていません。
4658 このコードは何も間違っていないかもしれませんが、レビューする価値があります。
4659 </p>
4660
4661
4662 <h3><a name="FE_FLOATING_POINT_EQUALITY">FE: 浮動小数点の等価性のためのテスト (FE_FLOATING_POINT _EQUALITY)</a></h3>
4663
4664
4665 <p>
4666 この演算は、等価性のために2つの浮動小数点値を比較しています。
4667 浮動小数点の計算は丸めを伴うかもしれないので計算された float と double の値は正確ではないかもしれません。
4668 通貨のような正確でなければならない値のために <code>BigDecimal</code> のような固定精度型を使用することを検討してください。
4669 正確である必要がない値のためにいくつかの範囲の中で等価性のために比較することを検討してください。
4670 たとえば、<code>if (Math.abs(x - y) &lt; .0000001)</code>。<br>
4671 詳細は Java 言語仕様4.2.4を参照してください。
4672 </p>
4673
4674
4675 <h3><a name="VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN">FS: Boolean 型でない引数を %b 書式指示子を使用してフォーマットしている (VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN)</a></h3>
4676
4677
4678 <p>
4679 Boolean 型でない引数を %b 書式指示子でフォーマットしています。これは例外をスローしません。
4680 その代わりに、非 null 値では true 、null では false を出力します。
4681 書式文字列のこの機能は奇妙で意図したことではないかもしれません。
4682 </p>
4683
4684
4685 <h3><a name="IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD">IA: 潜在的な継承された メソッドなのか外部のメソッドなのかあいまいなメソッドの呼び出し (IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_M ETHOD)</a></h3>
4686
4687
4688 <p>
4689 内部クラスは、継承されたメソッドか外部クラスで定義されたメソッドなのかどちらとも解釈できるメソッドを呼び出しています。
4690 たとえば、<code>foo(17)</code> を呼び出します。それはスーパークラスと外部のメソッドの両方で定義されています。
4691 Java のセマンティックスでは、継承したメソッドを呼び出しますが、これはあなたが意図したことではないかもしれません。
4692 </p>
4693 <p>
4694 本当に継承されたメソッドを呼び出すつもりなら super を付けて (例:super.foo(17)) 呼び出してください。
4695 そうすれば、外部クラスのメソッドではなく継承されたメソッドを呼び出したいことがこのコードを読む人と FindBugs に明確になります。
4696 </p>
4697 <p>
4698 <code>this.foo(17)</code> を呼び出す場合は、継承されたメソッドが呼び出されます。
4699 しかしながら、FindBugs はクラスファイルを見るだけなので、<code>this.foo(17)</code> と <code>foo(17)</code > の呼び出しの違いを見分けることができません。
4700 潜在的なあいまいな呼び出しについて文句を言うでしょう。
4701 </p>
4702
4703
4704 <h3><a name="IC_INIT_CIRCULARITY">IC: 初期化が循環している (IC_INIT_CIRCULARITY)</a></h3>
4705
4706
4707 <p>
4708 バグインスタンスによって参照される2つのクラスのスタティックイニシャライザで循環が検出されました。
4709 さまざまな予想外の振る舞いはそのような循環に起因することがあります。
4710 </p>
4711
4712
4713 <h3><a name="ICAST_IDIV_CAST_TO_DOUBLE">ICAST: 整数の除算の結果を double または float にキャストし ている (ICAST_IDIV_CAST_TO_DOUBLE)</a></h3>
4714
4715
4716 <p>
4717 このコードは 整数の除算の結果を double または float にキャストしています。
4718 整数で除算をすることは、ゼロに最も近い整数値まで結果を切り捨てます。
4719 結果が double にキャストされたという事実は、この精度が維持されるべきだったことを示唆しています。
4720 おそらく意味されたことは、除算を実行する前にオペランドの1つまたは両方を double にキャストすることでした。<br>
4721 以下に例を示します。
4722 </p>
4723 <blockquote><pre>
4724 int x = 2;
4725 int y = 5;
4726 // Wrong: yields result 0.0
4727 double value1 = x / y;
4728
4729 // Right: yields result 0.4
4730 double value2 = x / (double) y;
4731 </pre></blockquote>
4732
4733
4734 <h3><a name="ICAST_INTEGER_MULTIPLY_CAST_TO_LONG">ICAST: 整数乗算の結果を long にキャストしている (ICAST_INTEGER_MULTIPLY_CAST_TO_LONG)</a></h3>
4735
4736
4737 <p>
4738 このコードは、以下のように整数の乗算を実行してから結果を long に変換しています。
4739 </p>
4740 <blockquote><pre>
4741 long convertDaysToMilliseconds(int days) { return 1000*3600*24*days; }
4742 </pre></blockquote>
4743 <p>
4744 long を使用して乗算をすれば、結果がオーバーフローするという可能性を回避できます。<br>
4745 たとえば以下のように修正できます。
4746 </p>
4747 <blockquote><pre>
4748 long convertDaysToMilliseconds(int days) { return 1000L*3600*24*days; }
4749 </pre></blockquote>
4750 <p>
4751 または
4752 </p>
4753 <blockquote><pre>
4754 static final long MILLISECONDS_PER_DAY = 24L*3600*1000;
4755 long convertDaysToMilliseconds(int days) { return days * MILLISECONDS_PER_DAY; }
4756 </pre></blockquote>
4757
4758
4759 <h3><a name="IM_AVERAGE_COMPUTATION_COULD_OVERFLOW">IM: 平均の計算はオーバーフローする可能性がある (I M_AVERAGE_COMPUTATION_COULD_OVERFLOW)</a></h3>
4760
4761
4762 <p>
4763 このコードは、除算か符号付き右シフトを使用して2つの整数の平均を計算して、結果を配列の添字として使用しています。
4764 平均値が非常に大きいならオーバーフローする可能性があります (結果として負の平均の計算になる)。
4765 結果が負でないことを意図していたなら、その代わりに符号なし右シフトを使用できます。
4766 つまり、<code>(low+high)/2</code> ではなく <code>(low+high) &gt;&gt;&gt; 1</code> を使用してく ださい。
4767 </p>
4768 <p>
4769 このバグは、二分探索とマージソートの多くの以前の実装で存在します。
4770 Martin Buchholz が <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=64 12541">JDK ライブラリのバグを発見して修正しています</a>。
4771 Joshua Bloch が <a href="http://googleresearch.blogspot.com/2006/06/extra-extra-r ead-all-about-it-nearly.html">バグパターンとして公表しました</a>。
4772 </p>
4773
4774
4775 <h3><a name="IM_BAD_CHECK_FOR_ODD">IM: 負数で機能しない奇数チェック (IM_BAD_CHECK_FOR_ODD)</a> </h3>
4776
4777
4778 <p>
4779 このコードは、<code>x % 2 == 1</code> を使用して値が負数なのか確かめていますが、負数 (たとえば、<code>(-5) % 2 == - 1</code>) なので機能しません。
4780 奇数チェックを意図しているなら、<code>x &amp; 1 == 1</code> または <code>x % 2 != 0</code> を使用することを 検討してください。
4781 </p>
4782
4783
4784 <h3><a name="INT_BAD_REM_BY_1">INT: 1を法とする整数の剰余 (INT_BAD_REM_BY_1)</a></h3>
4785
4786
4787 <p>
4788 どんな式 <code>(exp % 1)</code> も常に0を返すことが保証されています。
4789 そうではなく、<code>(exp &amp; 1)</code> または <code>(exp &amp; 2)</code> を意味していましたか?
4790 </p>
4791
4792
4793 <h3><a name="INT_VACUOUS_BIT_OPERATION">INT: 整数値の無意味なビットマスク演算 (INT_VACUOUS_BIT_O PERATION)</a></h3>
4794
4795
4796 <p>
4797 どんな有用な仕事もしない整数ビット演算 (AND、OR、XOR) です (たとえば <code>v & 0xffffffff</code>)。
4798 </p>
4799
4800
4801 <h3><a name="INT_VACUOUS_COMPARISON">INT: 整数値の無意味な比較 (INT_VACUOUS_COMPARISON)</a ></h3>
4802
4803
4804 <p>
4805 常に同じ値を返す整数の比較があります (たとえば <code>x &lt;= Integer.MAX_VALUE</code>)。
4806 </p>
4807
4808
4809 <h3><a name="MTIA_SUSPECT_SERVLET_INSTANCE_FIELD">MTIA: Servlet クラスを拡張したクラスでのインス タンス変数の使用 (MTIA_SUSPECT_SERVLET_INSTANCE_FIELD)</a></h3>
4810
4811
4812 <p>
4813 Servletクラスを拡張したクラスで、インスタンス変数を使用しています。
4814 Servlet クラスの1つのインスタンスだけが Java EE フレームワークによって作成され、マルチスレッドによって使われるので、このパラダイムは極めて問題 があり、推奨できません。
4815 ローカル変数を使用することだけを検討してください。
4816 </p>
4817
4818
4819 <h3><a name="MTIA_SUSPECT_STRUTS_INSTANCE_FIELD">MTIA: Struts Action を拡張したクラスでのイ ンスタンス変数の使用 (MTIA_SUSPECT_STRUTS_INSTANCE_FIELD)</a></h3>
4820
4821
4822 <p>
4823 Struts Action クラスを拡張したクラスで、インスタンス変数を使用しています。
4824 Struts Action クラスの1つのインスタンスだけが Struts フレームワークによって作成され、マルチスレッドによって使われるので、このパラダイムは 極めて問題があり、推奨できません。
4825 ローカル変数を使用することだけを検討してください。
4826 モニタを除いて書き込まれるインスタンスフィールドだけが報告されます。
4827 </p>
4828
4829
4830 <h3><a name="NP_DEREFERENCE_OF_READLINE_VALUE">NP: readLine メソッドの結果が null なのか確かめ ないで値を利用している (NP_DEREFERENCE_OF_READLINE_VALUE)</a></h3>
4831
4832
4833 <p>
4834 <code>readLine</code> メソッドの結果が null なのか確かめないで値を利用しています。
4835 <code>readLine</code> メソッドは、それ以上読み出すテキスト行がなければ null を返すので、NullPointerException が 発生します。
4836 </p>
4837
4838
4839 <h3><a name="NP_IMMEDIATE_DEREFERENCE_OF_READLINE">NP: readLine メソッドの結果をすぐに利用してい る (NP_IMMEDIATE_DEREFERENCE_OF_READLINE)</a></h3>
4840
4841
4842 <p>
4843 <code>readLine</code> メソッドの結果をすぐに利用しています。
4844 <code>readLine</code> メソッドは、それ以上読み出すテキスト行がなければ null を返すので、NullPointerException が 発生します。
4845 </p>
4846
4847
4848 <h3><a name="NP_LOAD_OF_KNOWN_NULL_VALUE">NP: null とわかっている値のロード (NP_LOAD_OF_KNOW N_NULL_VALUE)</a></h3>
4849
4850
4851 <p>
4852 ここで参照されている変数は、以前に null なのかチェックしているため null であることがわかっています。
4853 これは有効ですが、間違いかもしれません (多分異なる変数を参照することを意図してました、または以前の null チェックで null でないのか確かめるべきで した)。
4854 </p>
4855
4856
4857 <h3><a name="NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION">NP: メソッドはパラメータに nullness ア ノテーションを強化している (NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION)</a></h3>
4858
4859
4860 <p>
4861 メソッドは、オーバーライドするメソッドの契約を常に実装するべきです。
4862 したがって、メソッドが @Nullable としてマークされるパラメーターを取るならば、サブクラスでパラメーターを @Nonnull にしてメソッドをオーバーラ イドするべきでありません。
4863 そうするとメソッドが null パラメータを処理すべき契約を破ります。
4864 </p>
4865
4866
4867 <h3><a name="NP_METHOD_RETURN_RELAXING_ANNOTATION">NP: メソッドは戻り値の nullness アノテーショ ンを緩和している (NP_METHOD_RETURN_RELAXING_ANNOTATION)</a></h3>
4868
4869
4870 <p>
4871 メソッドは、オーバーライドするメソッドの契約を常に実装するべきです。
4872 したがって、メソッドが @Nonnull 値を返すようにアノテートしているならば、サブクラスでメソッドが @Nullable または @CheckForNul l 値を返すようにアノテートしてメソッドをオーバーライドするべきでありません。
4873 そうするとメソッドが null を返すべできではない契約を破ります。
4874 </p>
4875
4876
4877 <h3><a name="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE">NP: null になっている可能性があるメソッドの戻 り値を利用している (NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE)</a></h3>
4878
4879
4880 <p>
4881 メソッドからの戻り値を null チェックしないで利用しています。メソッドの戻り値は null なのかチェックするべきです。
4882 コードが実行されると NullPointerException を引き起こすことがあります。
4883 </p>
4884
4885
4886 <h3><a name="NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE">NP: null 値を実行不可能かもしれない分岐で 利用している可能性がある (NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE)</a></h3>
4887
4888
4889 <p>
4890 分岐または文が実行されるなら、null 値が利用されて NullPointerException が発生します。
4891 もちろん、問題は分岐または文が実行不可能で、NullPointerException が決して発生する可能性がないということかもしれません。
4892 それを決めるのは FindBugs の能力を超えています。
4893 この値が既に null であることを検査したという事実からこれは明確な可能性です。
4894 </p>
4895
4896
4897 <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>
4898
4899
4900 <p>
4901 このパラメータは、常に 非 null にすることを要求する方法で使われていますが、パラメータには明示的に null 可能としてアノテートされています。
4902 パラメータかアノテーションのどちらかの使い方が間違っています。
4903 </p>
4904
4905
4906 <h3><a name="NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD">NP: 書き込まれていない public または pr otected フィールドの読み出し (NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD)</a></h3>
4907
4908
4909 <p>
4910 プログラムは、決して null 値でない値を書き込むと思われない public または protected フィールドの null 値を利用しています。
4911 フィールドが解析によって見られない機構を通して初期化されないかぎり、この値を利用すると NullPointerException が発生します。
4912 </p>
4913
4914
4915 <h3><a name="NS_DANGEROUS_NON_SHORT_CIRCUIT">NS: 潜在的な非短絡論理の危険な使用 (NS_DANGEROUS_N ON_SHORT_CIRCUIT)</a></h3>
4916
4917
4918 <p>
4919 このコードは、短絡論理 (&amp;&amp; や ||) ではなく非短絡論理 (&amp; や |) を使用していると思われます。
4920 さらに、左辺値によって右辺を評価したくない (例外のスローや演算が高くつく副作用があるため) と思っているのかもしれません。
4921 非短絡論理は、左辺を知ることによって結果を推論できたとしても両側の式が評価されます。
4922 これは効率が悪く、右辺の評価でエラーが発生するケースを左辺でガードしているなら、結果としてエラーになる可能性があります。
4923 </p>
4924 <p>
4925 詳細については、<a href="http://java.sun.com/docs/books/jls/third_edition/html/expressio ns.html#15.22.2">the Java Language Specification</a> を参照してください。
4926 </p>
4927
4928
4929 <h3><a name="NS_NON_SHORT_CIRCUIT">NS: 非短絡論理の疑わしい使用 (NS_NON_SHORT_CIRCUIT)</a></ h3>
4930
4931
4932 <p>
4933 このコードは、短絡論理 (&amp;&amp; や ||) ではなく非短絡論理 (&amp; や |) を使用していると思われます。
4934 非短絡論理は、左辺を知ることによって結果を推論できたとしても両側の式が評価されます。
4935 これは効率が悪く、右辺の評価でエラーが発生するケースを左辺でガードしているなら、結果としてエラーになる可能性があります。
4936 </p>
4937 <p>
4938 詳細については、<a href="http://java.sun.com/docs/books/jls/third_edition/html/expressio ns.html#15.22.2">the Java Language Specification</a> を参照してください。
4939 </p>
4940
4941
4942 <h3><a name="PZLA_PREFER_ZERO_LENGTH_ARRAYS">PZLA: null ではなく長さが0の配列を返すことを検討する (P ZLA_PREFER_ZERO_LENGTH_ARRAYS)</a></h3>
4943
4944
4945 <p>
4946 結果がないこと (すなわち、結果の空のリスト) を示すために null 参照ではなく長さが0の配列 を返すことは、多くの場合より良い設計です。
4947 </p>
4948 <p>
4949 他方では、「この質問に対する答えがない」ことを示すために null を使用することはおそらく適切です。
4950 たとえば、<code>File.listFiles()</code> は、ファイルがないディレクトリを与えられた場合は空のリストを返し、ファイルがディレクトリで ないなら null を返します。
4951 </p>
4952
4953
4954 <h3><a name="QF_QUESTIONABLE_FOR_LOOP">QF: 複雑か巧妙か間違ったインクリメントの for ループ (QF_QUESTI ONABLE_FOR_LOOP)</a></h3>
4955
4956
4957 <p>
4958 本当にこの for ループが正しい変数をインクリメントしていますか?
4959 別の変数が for ループによって初期化されてチェックされるように見えます。
4960 </p>
4961
4962
4963 <h3><a name="RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE">RCN: 非 null 値と null 値との冗長な比較 (RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE)</a></h3>
4964
4965
4966 <p>
4967 このメソッドにはnull でないことがわかっている参照と null とわかっている別の参照との比較があります。
4968 </p>
4969
4970
4971 <h3><a name="RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES">RCN: 2つの null 値の冗長な比較 (RC N_REDUNDANT_COMPARISON_TWO_NULL_VALUES)</a></h3>
4972
4973
4974 <p>
4975 このメソッドには両方とも明らかに null とわかっている2つの参照の冗長な比較があります。
4976 </p>
4977
4978
4979 <h3><a name="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE">RCN: null でないことがわかっている値の冗 長な null チェック (RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE)</a></h3>
4980
4981
4982 <p>
4983 このメソッドには null でないことがわかっている値の冗長な null チェックがあります。
4984 </p>
4985
4986
4987 <h3><a name="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE">RCN: null とわかっている値の冗長な null チェック (RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE)</a></h3>
4988
4989
4990 <p>
4991 このメソッドにはnull とわかっている値の冗長な null チェックがあります。
4992 </p>
4993
4994
4995 <h3><a name="REC_CATCH_EXCEPTION">REC: 例外がスローされないのに例外をキャッチしている (REC_CATCH_EXCEPT ION)</a></h3>
4996
4997
4998 <p>
4999 このメソッドは、例外オブジェクトをキャッチする try-catch ブロックを使用していますが、例外は try ブロックの中でスローされません。また、実行時例外 は明示的にキャッチされません。
5000 それぞれの catch ブロックが同一である多くの例外型をキャッチすることの短縮形として <code>try { ... } catch (Exception e) { something }</code> を使用することが共通のバグパターンです。
5001 しかし、この構文は誤って実行時例外も同様にキャッチするので、潜在的なバグを隠します。
5002 </p>
5003 <p>
5004 より良いアプローチは、明示的にキャッチするよりもスローされる特定の例外をスローします。
5005 あるいは、以下に示すように明示的に RuntimeException をキャッチ、再スローして、非実行時例外をキャッチします。
5006 </p>
5007 <blockquote><pre>
5008 try {
5009 ...
5010 } catch (RuntimeException e) {
5011 throw e;
5012 } catch (Exception e) {
5013 ... deal with all non-runtime exceptions ...
5014 }
5015 </pre></blockquote>
5016
5017
5018 <h3><a name="RI_REDUNDANT_INTERFACES">RI: スーパークラスと同じインタフェースを実装しているクラス (RI_REDUND ANT_INTERFACES)</a></h3>
5019
5020
5021 <p>
5022 このクラスは、スーパークラスによっても実装されるインタフェースを実装することを宣言しています。
5023 スーパークラスがインタフェースを実装するので、これは冗長です。デフォルトですべてのサブクラスもこのインタフェースを実装します。
5024 このクラスが作成されてから継承階層が変わったことを指摘するかもしれません。インタフェースの実装の所有権を考慮するべきです。
5025 </p>
5026
5027
5028 <h3><a name="RV_CHECK_FOR_POSITIVE_INDEXOF">RV: String.indexOf の結果が正かどうか確かめている ( RV_CHECK_FOR_POSITIVE_INDEXOF)</a></h3>
5029
5030
5031 <p>
5032 このメソッドは <code>String.indexOf</code> を呼び出して結果が正かどうか確かめています。
5033 結果が負かどうか確かめるほうがずっと典型的です。チェックされる部分文字列が先頭以外の場所で出現するときだけ正になります。
5034 </p>
5035
5036
5037 <h3><a name="RV_DONT_JUST_NULL_CHECK_READLINE">RV: readLine メソッドの結果を null でないのか確 かめた後で捨てている (RV_DONT_JUST_NULL_CHECK_READLINE)</a></h3>
5038
5039
5040 <p>
5041 <code>readLine</code> メソッドの戻り値を null でないのか確かめた後で捨てています。
5042 ほとんどすべての状況で、結果が null でないなら戻り値を使用したいでしょう。
5043 再び <code>readLine</code> メソッドを呼び出すと異なる行が得られます。
5044 </p>
5045
5046
5047 <h3><a name="RV_REM_OF_HASHCODE">RV: ハッシュコードの剰余は負かもしれない (RV_REM_OF_HASHCODE)</a> </h3>
5048
5049
5050 <p>
5051 このコードは、ハッシュコードを計算して別の値を法とする剰余を計算しています。
5052 ハッシュコードは負になり、剰余演算の結果も負なります。
5053 </p>
5054 <p>
5055 計算結果が負ではないことを確認したいなら、コードを変更する必要があるかもしれません。
5056 除数が2の累乗であることがわかっているなら、代わりにビット演算を使用できます (すなわち、<code>x.hashCode()%n</code> の代わりに < code>x.hashCode()&amp;(n-1)</code> を使用してください)。
5057 これはおそらく、剰余を計算するより高速です。
5058 除数が2の累乗であるということをわかっていないなら、剰余演算の結果の絶対値を取得してください (すなわち <code>Math.abs(x.hashCode() %n)</code>)。
5059 </p>
5060
5061
5062 <h3><a name="RV_REM_OF_RANDOM_INT">RV: 符号付き32ビット整数の乱数の剰余 (RV_REM_OF_RANDOM_INT)< /a></h3>
5063
5064
5065 <p>
5066 このコードは符号付き整数の乱数を生成して別の値を法とする剰余を計算しています。
5067 乱数は負になり、剰余演算の結果も負になります。これが意図したことであることを確実にしてください。
5068 その代わりに <code>Random.nextInt(int)</code> の使用を強く検討してください。
5069 </p>
5070
5071
5072 <h3><a name="RV_RETURN_VALUE_IGNORED_INFERRED">RV: メソッドは戻り値を無視しています、これは間違いではないです か? (RV_RETURN_VALUE_IGNORED_INFERRED)</a></h3>
5073
5074
5075 <p>
5076 このコードは、メソッドを呼び出して、戻り値を無視しています。
5077 戻り値は、メソッドが呼び出される型と同じ型です。そして、我々の解析から戻り値が重要であるかもしれないように見えます (たとえば、<code>String.toL owerCase()</code> の戻り値を無視するような)。
5078 </p>
5079 <p>
5080 我々は、戻り値を無視することがメソッド本体の単純な解析から悪い考えかもしれないと推測しています。
5081 このメソッドの戻り値を無視することが重要であるか許容できるかどうかに関して、FindBugs に指示する @CheckReturnValue アノテーションが使 えます。
5082 </p>
5083 <p>
5084 戻り値を無視することが間違いではないか決めるために厳密に調査してください。
5085 </p>
5086
5087
5088 <h3><a name="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT">RV: 副作用がないメソッドの戻り値は無視される (R V_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT)</a></h3>
5089
5090
5091 <p>
5092 このコードは、メソッドを呼び出して戻り値を無視しています。
5093 しかしながら、解析はメソッド (もしあればサブクラスの実装も含む) が戻り値以外の効果をもたらさないことを示しています。
5094 この呼び出しは除去できます。
5095 </p>
5096 <p>
5097 我々は、できる限り誤検出を減らそうとしていますが、いくつかのケースではこの警告が間違っているかもしれません。
5098 よくある誤検出です。
5099 </p>
5100 <p>
5101 - メソッドは、オーバライドされ解析対象外の他のプロジェクトで副作用がもたらされるように設計されている
5102 <p>
5103 <p>
5104 - メソッドは、副作用をもたらすかもしれないクラスローダをトリガーするように呼び出されている
5105 </p>
5106 <p>
5107 - メソッドは、例外を取得するために呼び出されている
5108 </p>
5109 <p>
5110 我々の仮定が正しくないと感じるなら、FindBugs にこのメソッドの戻り値が無視されることを許容するように指示する @CheckReturnValue アノテ ーションを使用することができます。
5111 </p>
5112
5113
5114 <h3><a name="SA_FIELD_DOUBLE_ASSIGNMENT">SA: フィールドの二重代入 (SA_FIELD_DOUBLE_ASSIGNM ENT)</a></h3>
5115
5116
5117 <p>
5118 このメソッドにはフィールドの二重代入があります。<br>
5119 たとえば以下のようなコードです。
5120 </p>
5121 <blockquote><pre>
5122 int x,y;
5123 public void foo() {
5124 x = x = 17;
5125 }
5126 </pre></blockquote>
5127 <p>
5128 フィールドに2回代入することは役に立たないので、論理エラーかタイプミスかもしれません。
5129 </p>
5130
5131
5132 <h3><a name="SA_LOCAL_DOUBLE_ASSIGNMENT">SA: ローカル変数の二重代入 (SA_LOCAL_DOUBLE_ASSIGN MENT)</a></h3>
5133
5134
5135 <p>
5136 このメソッドにはローカル変数の二重代入があります。<br>
5137 たとえば以下のようなコードです。
5138 </p>
5139 <blockquote><pre>
5140 public void foo() {
5141 int x,y;
5142 x = x = 17;
5143 }
5144 </pre></blockquote>
5145 <p>
5146 変数に同じ値を2回代入することは役に立たないので、論理エラーかタイプミスかもしれません。
5147 </p>
5148
5149
5150 <h3><a name="SA_LOCAL_SELF_ASSIGNMENT">SA: ローカル変数の自己代入 (SA_LOCAL_SELF_ASSIGNMENT )</a></h3>
5151
5152
5153 <p>
5154 このメソッドにはローカル変数の自己代入があります。<br>
5155 たとえば以下のようなコードです。
5156 </p>
5157 <blockquote><pre>
5158 public void foo() {
5159 int x = 3;
5160 x = x;
5161 }
5162 </pre></blockquote>
5163 <p>
5164 そのような代入は役に立たないので、論理エラーかタイプミスかもしれません。
5165 </p>
5166
5167
5168 <h3><a name="SF_SWITCH_FALLTHROUGH">SF: 1つの case が次の case へと通り抜ける switch 文を発見した (SF_SWITCH_FALLTHROUGH)</a></h3>
5169
5170
5171 <p>
5172 このメソッドには1つの case が次の case へと通り抜ける switch 文があります。
5173 通常は、break か return でこの case を終わらせる必要があります。
5174 </p>
5175
5176
5177 <h3><a name="SF_SWITCH_NO_DEFAULT">SF: default がない switch 文を発見した (SF_SWITCH_NO_D EFAULT)</a></h3>
5178
5179
5180 <p>
5181 このメソッドにはdefault がない switch 文があります。
5182 通常は、default を用意する必要があります。
5183 </p>
5184 <p>
5185 解析は生成されたバイトコードを見るだけなので、default が switch 文の終わりにあって、他のケースに break 文が含まれていないなら誤検出のト リガーとなります。
5186 </p>
5187
5188
5189 <h3><a name="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD">ST: インスタンスメソッドから static フィ ールドへの書き込み (ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD)</a></h3>
5190
5191
5192 <p>
5193 このインスタンスメソッドは、static フィールドに書き込みをしています。
5194 複数のインスタンスが操作されているなら、正しくさせるのは難しいです。一般的にバッドプラクティスです。
5195 </p>
5196
5197
5198 <h3><a name="SE_PRIVATE_READ_RESOLVE_NOT_INHERITED">Se: サブクラスで継承できない private な r eadResolve メソッド (SE_PRIVATE_READ_RESOLVE_NOT_INHERITED)</a></h3>
5199
5200
5201 <p>
5202 このクラスは、private な <code>readResolve</code> メソッドを定義しています。
5203 そのため、このメソッドはサブクラスで継承できません。
5204 これが意図したことなら間違っていないかもしれませんが確認するためにレビューするべきです。
5205 </p>
5206
5207
5208 <h3><a name="SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS">Se: Serializable でないクラ スの transient フィールド (SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS)</a></h3>
5209
5210
5211 <p>
5212 フィールドは、transient と宣言していますが、クラスは直列化可能ではないので、まったく効果がありません。
5213 クラスが transient だったときの名残かもしれません、または直列化機構を誤解しているのかもしれません。
5214 </p>
5215
5216
5217 <h3><a name="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK">TQ: 値は型修飾子を必要 としているが、不明としてマークされている (TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK)</a>< /h3>
5218
5219
5220 <p>
5221 値は、常に型修飾子によって示された値であることを必要とする方法で使われています。
5222 しかし、値はどこでその型修飾子が必要なのかわからないと述べている明示的なアノテーションがあります。
5223 使い方かアノテーションのどちらかが間違っています。
5224 </p>
5225
5226
5227 <h3><a name="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK">TQ: 値は型修飾子を必要と しないが、不明としてマークされている (TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK)</a></h3 >
5228
5229
5230 <p>
5231 値は、型修飾子によって示された値でないことを必要とする方法で使われています。
5232 しかし、値はどこでその型修飾子がいるのか禁止されていのるかわからないと述べている明示的なアノテーションがあります。
5233 使い方かアノテーションのどちらかが間違っています。
5234 </p>
5235
5236
5237 <h3><a name="UC_USELESS_CONDITION">UC: 条件は効果がない (UC_USELESS_CONDITION)</a></h3>
5238
5239
5240 <p>
5241 この条件は常に関係している変数の値が前に絞られたのと同じ結果を作り出します。
5242 おそらく何かほかのことを意味していたのか、あるいは条件を除去できます。
5243 </p>
5244
5245
5246 <h3><a name="UC_USELESS_CONDITION_TYPE">UC: 条件は変数型のために効果がない (UC_USELESS_CONDITIO N_TYPE)</a></h3>
5247
5248
5249 <p>
5250 この条件は関係している変数の型範囲のために常に同じ結果を作り出します。
5251 おそらく何かほかのことを意味していたのか、あるいは条件を除去できます。
5252 </p>
5253
5254
5255 <h3><a name="UC_USELESS_OBJECT">UC: 役に立たないオブジェクトを作成した (UC_USELESS_OBJECT)</a></h 3>
5256
5257
5258 <p>
5259 我々の解析でオブジェクトが役に立たないことを示しています。
5260 作成され、変更されていますが、値はメソッドの外に出ないし、副作用をもたらしません。
5261 間違いかオブジェクトが使われることを意図していたかのどちらか、あるいは除去できます。
5262 </p>
5263 <p>
5264 この解析はめったに誤検出することはありません。よくある誤検出のケースです。
5265 </p>
5266 <p>- 暗黙のうちに曖昧な例外をスローした</p>
5267 <p>- コードを一般化してスタブとして使用された</p>
5268 <p>- 弱/ソフト参照オブジェクトへの強い参照を持っていた</p>
5269
5270
5271 <h3><a name="UC_USELESS_OBJECT_STACK">UC: 役に立たないオブジェクトをスタックで作成した (UC_USELESS_OBJ ECT_STACK)</a></h3>
5272
5273
5274 <p>
5275 このオブジェクトは副作用を持たない修正を行うために作成されています。
5276 おそらく何かほかのことを意味していたのか、あるいはオブジェクトを除去できます。
5277 </p>
5278
5279
5280 <h3><a name="UC_USELESS_VOID_METHOD">UC: 役に立たない空ではない void メソッド (UC_USELESS_VOID_ METHOD)</a></h3>
5281
5282
5283 <p>
5284 我々の解析は、この空ではない void メソッドが実際に有用な仕事を行わないことを示しています。
5285 確認してください。おそらくそのコードが間違っているか、またはボディを完全に除去できます。
5286 </p>
5287 <p>
5288 我々はできる限り誤検出を減らそうと努力しているが、いくつかのケースでは警告は間違っているかもしれません。
5289 よくある誤検出例です。
5290 </p>
5291 <p>
5292 - メソッドは、副作用を持つかもしれないクラスのロードをトリガすることを意図している
5293 </p>
5294 <p>
5295 - メソッドは、暗黙のわかりにくい例外をスローするように意図されている
5296 </p>
5297
5298
5299 <h3><a name="UCF_USELESS_CONTROL_FLOW">UCF: 役に立たない制御フロー (UCF_USELESS_CONTROL_FLO W)</a></h3>
5300
5301
5302 <p>
5303 このメソッドには分岐するのかどうかに関係なく、制御フローが同じ場所へと続く、役に立たない制御フロー文があります。<br>
5304 たとえば、これは 空の <code>if</code> 文が原因になります。
5305 </p>
5306 <blockquote><pre>
5307 if (argv.length == 0) {
5308 // TODO: handle this case
5309 }
5310 </pre></blockquote>
5311
5312
5313 <h3><a name="UCF_USELESS_CONTROL_FLOW_NEXT_LINE">UCF: 次の行へ続くだけの役に立たない制御フロー (UCF_ USELESS_CONTROL_FLOW_NEXT_LINE)</a></h3>
5314
5315
5316 <p>
5317 このメソッドには分岐するのかどうかに関係なく、制御フローが同じか次の行へと続く、役に立たない制御フロー文があります。<br>
5318 多くの場合、不注意に <code>if</code> 文の本体を空文を使用したことが原因になります。
5319 </p>
5320 <blockquote><pre>
5321 if (argv.length == 1);
5322 System.out.println("Hello, " + argv[0]);
5323 </pre></blockquote>
5324
5325
5326 <h3><a name="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD">UrF: 読み出されない public または prote cted フィールド (URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD)</a></h3>
5327
5328
5329 <p>
5330 このフィールドは決して読み出されません。
5331 フィールドは、public か protected なので、多分、それは解析の一部として見えないクラスで使用されることを意図しています。
5332 そうでなければ、クラスから除去することを検討してください。
5333 </p>
5334
5335
5336 <h3><a name="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD">UuF: 未使用の public または protecte d フィールド (UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD)</a></h3>
5337
5338
5339 <p>
5340 このフィールドは決して使用されません。
5341 フィールドは、public か protected なので、多分、それは解析の一部として見えないクラスで使用されることを意図しています。
5342 そうでなければ、クラスから除去することを検討してください。
5343 </p>
5344
5345
5346 <h3><a name="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR">UwF: コンストラクタで初期化されていないフィー ルドを null チェックなしで null 値を利用している (UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR)</a></h 3>
5347
5348
5349 <p>
5350 このフィールドは、どんなコンストラクタの中でも決して初期化されません。したがって、オブジェクトが構築された後、null である可能性があります。
5351 どこかほかで、値がロードされて、null チェックなしで null 値が利用されます。
5352 フィールドが初期化される前に利用されると NullPointerException が発生するので、誤りか疑わしい設計かもしれません。
5353 </p>
5354
5355
5356 <h3><a name="UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD">UwF: 書き込まてれいない public または protected フィールド (UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD)</a></h3>
5357
5358
5359 <p>
5360 この public または protected フィールドは書き込まれていません。このフィールドからの読み出しはデフォルト値を返します。
5361 誤りをチェックしてください (フィールドは初期化するべきでしたか?)。役に立たないなら除去してください。
5362 </p>
5363
5364
5365 <h3><a name="XFB_XML_FACTORY_BYPASS">XFB: XMLインタフェースの特定の実装のインスタンスを作成しているメソッド (XF B_XML_FACTORY_BYPASS)</a></h3>
5366
5367
5368 <p>
5369 このメソッドは、XMLインタフェースの特定の実装のインスタンスを作成しています。
5370 提供されたファクトリクラスを使用してオブジェクトを作成して実行時に実装を変更できるようにすることが望ましいです。<br>
5371 詳細は、以下を参照してください。
5372 </p>
5373 <ul>
5374 <li>javax.xml.parsers.DocumentBuilderFactory</li>
5375 <li>javax.xml.parsers.SAXParserFactory</li>
5376 <li>javax.xml.transform.TransformerFactory</li>
5377 <li>org.w3c.dom.Document.create<i>XXXX</i></li>
5378 </ul>
5379
5380
5381
5382
5383 <hr> <p>
5384 <script language="JavaScript" type="text/javascript">
5385 <!---//hide script from old browsers
5386 document.write( "Last updated "+ document.lastModified + "." );
5387 //end hiding contents --->
5388 </script>
5389 <p> Send comments to <a class="sidebar" href="mailto:findbugs@cs.umd.edu">findbu gs@cs.umd.edu</a>
5390 <p>
5391 <a href="http://sourceforge.net/projects/findbugs/"><img src="http://sourceforge .net/sflogo.php?group_id=96405&amp;type=5" width="210" height="62" border="0" al t="FindBugs on SourceForge.net" /></a>
5392 </td></tr></table>
5393 </body></html>
OLDNEW
« README.chromium ('K') | « doc/bugDescriptions_fr.html ('k') | doc/contributing.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698