S-JIS[2008-05-23/2010-08-21] 変更履歴

Eclipse3の警告抑止

Eclipseを使ってコーディングをしていると、自動的にエラー(赤い下線)や警告(黄色い下線)が出る。
クイックフィックス等を使って修正することが出来る(修正すべきだ)が、Eclipseの設定でエラー/警告のレベルを変えたり無視したりすることが出来る。

javacの-Xlintオプション(の「-」付き指定)に相当。[2007-08-25]


設定ダイアログ

設定は、プロジェクト毎か、Eclipse全体に対して行う。[2007-08-25/2008-05-23]

  1. Eclipse全体: メニューバーの「ウィンドウ(W)」→「設定(P)」で「設定」ダイアログを開く。
    プロジェクト毎:メニューバーの「プロジェクト(P)」→「プロパティー(P)」で「プロパティー」ダイアログを開く。
  2. 左側のツリーから「Javaコンパイラー」→「エラー/警告」を選択する。
  3. 右ペインで該当するチェックに対して「無視」「警告」「エラー」を選択する。

これらのプロジェクト固有の設定は、プロジェクトのディレクトリ直下に「.settings」というディレクトリがあり、そのorg.eclipse.jdt.core.prefsというファイルで保持されている。
すなわち、プロジェクト全体をCVSで管理していれば、警告の設定も共有できる(共有される)ということ。


エラー/警告の内容

エラーや警告には以下のようなものがある。

コード・スタイル(C)
問題 初期 メッセージ 内容 更新日
staticメンバーへの非staticアクセス(N) 警告 型 {1} からの static メソッド {2} には static を参照してください。 staticなメソッドを呼ぶのに、クラス名でなくインスタンスを指定している。
   "".valueOf(123);
○ String.valueOf(123);
static-access 2008-05-23
staticメンバーへの間接アクセス(I) 無視 {1} には、直接アクセスする必要があります。 親クラスのstaticメンバーへアクセスするのににサブクラスを指定している。
class S1 {
  public static int v;
}
class S2 extends S1{
}

  S2.v = 1;
static-access 2008-05-23
インスタンス・フィールドへの限定されていないアクセス(Q) 無視 フィールド {1} への非修飾アクセス。 インスタンスのフィールドへアクセスするときに「this.」や「super.」を付けてない。
int value;

void method() {
  value = 1;
}
unqualified-field-access 2008-05-23
何も記述のない空のブロック(B) 無視 空のブロックにはコードまたはコメントを記述する必要があります { }(catchブロックやメソッド・クラス本体等)に何も書かれていない。
void method() {}
  2008-08-24
外部化されていないストリング(欠落している/未使用の$NON-NLS$タグ) 無視 外部化されていない文字列リテラルです。直後に //$NON-NLS-<n>$ を続けてください。 文字列定数を直接使っている。
String s = "a";
↓こういうコメントを付けておくと
↓チェックが抑制される
String s = "a"; //$NON-NLS-1$
nls 2008-08-24

潜在的なプログラミングの問題(P)
問題 初期 メッセージ 内容 更新日
serialVersionUIDなしのシリアライズ可能クラス(Z) 警告 シリアライズ可能クラス {1} は long 型の static final serialVersionUID フィールドを宣言していません。 Serializableインターフェースを実装したクラスがserialVersionUIDを定義していない。
class Test implements Serializable {
}
serial 2008-05-23
予期しない論理代入の可能性(S) 無視 比較の代わりに予期せぬ代入が行われている可能性があります。代入を条件式の代用とすべきではありません。 真偽値の変数に代入しようとしている。「==」の間違いの可能性がある…が、そもそも真偽値で「==」を使うべきではない
boolean b = 〜;
if (b = true) { 〜 }
  2008-05-23
'finally'が正常に完了しない(F) 警告 finally ブロックは正常に完了しません。 finally節の中でreturnまたはthrowしている。
javacのfinally参照
int test() {
  try {
  } finally {
    return 1;
  }
}
finally 2008-05-23
空のステートメント 無視 不要なセミコロン  
;;
  2008-08-24
'switch'文のcaseのフォールスルー 無視 Switch文において、case ラベルの処理後に break などが抜けている可能性があります。 switchにおいて、何らかの処理を記述した後にbreakが無く、次のcase(やdefault)に処理が移る場合。
switch(n) {
case 1: case 2:
  System.out.println(n);
default:
  break;
}
fallthrough 2008-08-24
NULL参照
(Eclipse3.2)
無視 変数 {1} は NULL にのみすることができます。NULL に設定されたかまたは最後に使用されたときに NULL を確認されたかのどちらかです。 明らかにnullになっている変数に対して何らかの処理をしようとしている。
Object obj = null;
obj.toString();
null 2008-05-23
nullポインター・アクセス
(Eclipse3.4)
警告 null ポインター・アクセス: 変数 {1} はこのロケーションでは必ず null です。 2009-03-28
潜在的なnullポインター・アクセス
(Eclipse3.4)
無視 変数 {1} はこのロケーションで null の可能性があります 場合によってはnullになる可能性のある変数に対して何らかの処理をしようとしている。
void null2(int n) {
  Object obj = null;
  if (n == 1) {
    obj = new Object();
  }
  obj.toString();
}
null 2009-03-28

名前のシャドーイングおよび競合
問題 初期 メッセージ 内容 更新日
フィールド変数が他のフィールドまたは変数を隠蔽(H) 無視 フィールド {1} は、型 {2} からフィールドを隠しています。 継承元と継承先で同じ名前のフィールドがあるので、親クラスのフィールドが隠蔽される。
class Hide {
  int value;

  class Sub extends Hide {
    int value;
  }
}
hiding 2008-05-23
ローカル変数宣言が他のフィールドまたは変数を隠蔽(V) 無視 ローカル変数 {1} は、型 {2} からフィールドを隠しています。 ローカル変数名とフィールド変数名がかぶっているので、フィールドが隠蔽される。
class Hide {
  int value;

  void hide() {
    int value;
  }
}
hiding 2008-05-23

使用すべきではない制限されたAPI(E)
問題 初期 メッセージ 内容 更新日
使用すべきではないAPI 警告 {1} は使用すべきではありません。 非推奨(deprecated)になっているクラス・メソッドを使用している。
new Date("2008/05/23");
deprecation 2008-05-23

不要なコード(U)
問題 初期 メッセージ 内容 更新日
ローカル変数が読み取られない(L) 警告 ローカル変数 {1} は読み取られません。 ローカル変数が、宣言はされているが使われていない。
{ int n = 0; }
unused 2008-05-23
未使用のインポート(I) 警告 インポートされた {1} は一度も使用されていません。 インポートされたクラスが使われていない。
import java.util.List;
unused 2008-05-23
未使用のローカルまたはprivateメンバー 警告 {1} はローカルで読み取られません。 privateメソッド・privateフィールドが定義されているが、使われていない。
private int field;
private void method(){}
unused 2008-05-23
不要なキャストまたは'instanceof' 操作 無視 {1} から {2} へのキャストは不要です。 不要なキャストを行っている。
Number n = (Number)123;
cast 2008-08-24
型 {1} の式はすでに型 {2} のインスタンスです。 instanceofの結果が常に真。
String s = 〜;
if (s instanceof String) {
  〜
}
cast 2008-08-24

※「未使用のインポート」に関しては、そのソースファイル内の一番先頭にあるクラス(やインターフェース等)に対して@SuppressWarnings("unused")を付けてやると、警告が出なくなる。

総称型(G)
問題 初期 メッセージ 内容 更新日
未検査の総称型操作 警告 型の安全性: メソッド {1} は raw 型 {2} に属しています。 総称型 {3} への参照はパラメーター化される必要があります。 総称型(ジェネリクス)で型引数を指定せずにメソッドを使っている。
void test(List list) {
  list.add("abc");
}
unchecked 2008-05-23
raw型の使用
(Eclipse3.6)
警告 {1} は raw 型です。総称型 {2} への参照は、パラメーター化する必要があります 総称型(ジェネリクス)で型引数を指定せずに変数を宣言している。
元々はuncheckedだったので、Eclipseの起動時に
suppressRawWhenUnchecked=true
をセットすると、このチェックをしないらしい。
List list = new ArrayList();
void test(List list) {
}
rawtypes 2010-08-21
finalな型で制約された総称型パラメーター(Y) 警告 型パラメーター {1} は final 型 {2} で制約することはできません。 final 型はそれ以上拡張することはできません。 総称型(ジェネリクス)でextendsに指定したクラスがfinalである。
class Clz<T extends String> {
}
  2008-08-21

注釈(N
問題 初期 メッセージ 内容 更新日
'@Deprecated'の欠落 無視 型 {1} の使用すべきではないメソッド {2} は @Deprecated で注釈を付ける必要があります Javadocの@deprecatedタグが付けられているが、@Deprecatedアノテーションが付けられていない。
非推奨はJDK1.5以降ではアノテーションを使う
/** @deprecated */
void method() {
}
dep-ann 2008-10-25

警告の中には、@SuppressWarningsで抑止可能なものもある。
指定できる値(文字列)が無い場合、「@SuppressWarnings("all")」を指定すると止めることが出来る。(allは全警告を抑止する)
“指定できる文字列が無く、Eclipseの設定はいじりたくないが警告を抑止したい”という場合には使えるかな。


@SuppressWarningsに指定可能なトークン

Eclipse3.2・3.4で@SuppressWarningsに指定可能なトークン(値・文字列)は以下の通り。[2008-08-21/2010-08-21]
all boxing cast dep-ann deprecation fallthrough finally hiding incomplete-switch nls null rawtypes restriction serial static-access synthetic-access unchecked unqualified-field-access unused

それぞれが何を意味するか(の簡単な説明)は、Eclipseのヘルプに載っている。

  1. メニューバーの「ヘルプ(H)」→「ヘルプ目次(H)」
  2. 左ペインから「JDTプラグイン・デベロッパー・ガイド」→「プログラマーズ・ガイド」→「JDTコア」→「Javaコードのコンパイル (Compiling Java code)」
  3. 右ペインの一番下に「SuppressWarning注釈内で使用可能なトークンのリスト」が出ている。

Eclipse3.6ではどこに載っているか不明(苦笑) [2010-08-21]
追加されたrawtypesについては「Java開発ユーザー・ガイド」→「新機能」(What's New in 3.6 (JDT))の「Java Compiler」に載っている。

Sunのjavacで指定可能なトークン


Eclipseへ戻る / Javaの警告抑止へ戻る / 技術メモへ戻る
メールの送信先:ひしだま