S-JIS[2008-05-23/2010-08-21] 変更履歴
Eclipseを使ってコーディングをしていると、自動的にエラー(赤い下線)や警告(黄色い下線)が出る。
クイックフィックス等を使って修正することが出来る(修正すべきだ)が、Eclipseの設定でエラー/警告のレベルを変えたり無視したりすることが出来る。
javacの-Xlintオプション(の「-」付き指定)に相当。[2007-08-25]
設定は、プロジェクト毎か、Eclipse全体に対して行う。[2007-08-25/2008-05-23]
これらのプロジェクト固有の設定は、プロジェクトのディレクトリ直下に「.settings」というディレクトリがあり、そのorg.eclipse.jdt.core.prefsというファイルで保持されている。
すなわち、プロジェクト全体をCVSで管理していれば、警告の設定も共有できる(共有される)ということ。
エラーや警告には以下のようなものがある。
問題 | 初期 | メッセージ | 内容 | 例 | 値 | 更新日 |
---|---|---|---|---|---|---|
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 |
問題 | 初期 | メッセージ | 内容 | 例 | 値 | 更新日 |
---|---|---|---|---|---|---|
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 | 警告 | {1} は使用すべきではありません。 | 非推奨(deprecated)になっているクラス・メソッドを使用している。 |
new Date("2008/05/23");
|
deprecation | 2008-05-23 |
問題 | 初期 | メッセージ | 内容 | 例 | 値 | 更新日 |
---|---|---|---|---|---|---|
ローカル変数が読み取られない(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")を付けてやると、警告が出なくなる。
問題 | 初期 | メッセージ | 内容 | 例 | 値 | 更新日 |
---|---|---|---|---|---|---|
未検査の総称型操作 | 警告 | 型の安全性: メソッド {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 |
問題 | 初期 | メッセージ | 内容 | 例 | 値 | 更新日 |
---|---|---|---|---|---|---|
'@Deprecated'の欠落 | 無視 | 型 {1} の使用すべきではないメソッド {2} は @Deprecated で注釈を付ける必要があります | Javadocの@deprecatedタグが付けられているが、@Deprecatedアノテーションが付けられていない。 →非推奨はJDK1.5以降ではアノテーションを使う |
/** @deprecated */ void method() { } |
dep-ann | 2008-10-25 |
警告の中には、@SuppressWarningsで抑止可能なものもある。
指定できる値(文字列)が無い場合、「@SuppressWarnings("all")」を指定すると止めることが出来る。(allは全警告を抑止する)
“指定できる文字列が無く、Eclipseの設定はいじりたくないが警告を抑止したい”という場合には使えるかな。
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のヘルプに載っている。
Eclipse3.6ではどこに載っているか不明(苦笑) [2010-08-21]
追加されたrawtypesについては「Java開発ユーザー・ガイド」→「新機能」(What's New in
3.6 (JDT))の「Java Compiler」に載っている。