質問

私は最新のSunのJavaコンパイラを備えた新しいマシンに移動し、既存のJava 6コードでいくつかの警告に気付きました。 Eclipse Ideは、私が課題に次のことを注釈することを提案しました。

@SuppressWarnings("rawtypes")

例えば:

class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();

古いコンパイラ(JDK 1.6.0_20)を使用してマシンに戻ったとき、この古いコンパイラが「RawTypes」警告の抑制について警告していることに気づきました。 (「チェックされていない」)。また、デフォルトでは、最新のコンパイラが「未チェック」と「RawTypes」の両方を置くようになった場所がいくつかありました。古いコンパイラでそのコードをコンパイルすると同じ警告が再現されます。

どちらのコンパイラも警告を生成しないように、2つの間の後方/前方互換性を実施するにはどうすればよいですか?

役に立ちましたか?

解決

使用できます @SuppressWarnings("unchecked") これは、EclipseコンパイラとJavacの両方でサポートされています。

しかし、それを覚えておいてください @SuppressWarnings 注釈は、独自の値を持つことができるコンパイラによって使用されます。 JLSは、コンパイラに「未確認」と「非推奨」の値を(今のところ)理解させるだけです。

コンパイラベンダーは、この注釈タイプと併せてサポートする警告名を文書化する必要があります。 彼らは、同じ名前が複数のコンパイラで動作することを保証するために協力することをお勧めします.

Heliosを使用する場合、許可する特定のオプションを設定する必要があります @SuppressWarnings("unchecked") それ以外の @SuppressWarnings("rawtypes"),

新しいトークンでコードを更新できない場合、 suppressRawWhenUnchecked=true Eclipseを開始するときにシステムプロパティを設定できます。


資力 :


編集:ここに、元々書かれた参照として使用された現在利用できないKnolの記事があります アレックスミラー.

@suppresswarnings javaでの注釈

さまざまな警告を抑制するための標準注釈

SuppressWarningsアノテーションは、Java SE 5の標準注釈として追加されました。

意味

@suppresswarnings 注釈は、Java言語仕様で定義されています セクション9.6.1.5. 。このセクションでは、次のように述べています。

注釈タイプ SuppressWarnings Javaコンパイラによって発行された警告に対するプログラマ制御をサポートします。の配列である単一の要素が含まれています String. 。プログラム宣言に注釈が注釈が付けられている場合 @SuppressWarnings(value = {S1, ... , Sk}), 、その後、Javaコンパイラは、注釈付き宣言またはその部分の結果としてその警告が生成された場合、S1のいずれかによって識別された警告を報告してはなりません。

チェックされていない警告は、文字列によって識別されます」unchecked".

後続 セクション の上 @Deprecation また、これらの警告を抑制できることも言及しています @SuppressWarnings("deprecation").

有効な警告タイプ

仕様自体で言及されている2つの警告文字列は、「未確認」と「非難」です。ただし、Sun JDKはコンパイラ内のより大きな文字列セットを使用しています。実行することで現在のセットを決定できます。

javac -X

-xlintの有効な設定が(とりわけ)表示されます。

たとえば、Sun JDK 1.5が示しています。

  • すべて - このコードからのすべての警告を抑制します
  • 非推奨 - 非推奨コードの使用から警告を抑制します
  • 未チェック - チェックされていない呼び出しまたはチェックされていないキャストからの警告を抑制します
  • フォールスルー - 有効なケースを見つけることなくスイッチが通過した場合(およびデフォルトなし)警告を抑制する
  • 道 -
  • シリアル - シリアル化可能なクラスがSerialVersionUidを定義しない場合の警告を抑制する
  • 最後に - 最終的には戻りからの警告を抑制します(試行でリターンを無視します)

そしてSun JDK 1.6が追加します:

  • キャスト
  • Divzero-ゼロで整数分裂が検出された場合、警告を抑制します
  • オーバーライド
  • 無し

IDESおよび静的分析ツールは、通常、@SuppressWarningsの他の多くの可能な値をサポートしています。これらの値は、IDEによって実行される特定の静的解析チェックに対応しています。

日食

Eclipse 3.3の日食警告値はです JDTドキュメントで文書化されています.

  • すべて - すべての警告を抑制します
  • ボクシング - ボクシング/ボクシング操作に関する警告を抑制します
  • CAST -CAST操作に関する警告を抑制します
  • dep -ann-非推奨の注釈に対する警告を抑制します
  • 非難 - 非推奨に対する警告を抑制します
  • フォールスルー - スイッチステートメントの休憩の欠落に関連する警告を抑制します
  • 最後に - 戻ってこない最終的にブロックすることに対する警告を抑制します
  • 隠れ - 変数を隠す地元の人々に対する警告を抑制します
  • 不完全なスイッチ - スイッチステートメントの不足しているエントリに対する警告を抑制します(列挙場合)
  • NLS-非NLS文字列リテラルに対する警告を抑制します
  • null-ヌル分析に対する警告を抑制します
  • 制限 - 落胆または禁止された参照の使用に関する警告を抑制する
  • シリアル - シリアル化可能なクラスのシリアルバージョンの欠落フィールドに対する警告を抑制します
  • 静的アクセス - 誤った静的アクセスに対する警告を抑制します
  • Synthetic -Access-内部クラスからの最適化されていないアクセスに関する警告を抑制します
  • 未チェック - 未チェック操作に対する警告を抑制します
  • 資格のないフィールドアクセス - フィールドアクセスに対する警告を抑制していない
  • 未使用 - 未使用コードに対する警告を抑制します

Intellij

netbeans

単一の警告を指定する例:

@SuppressWarnings("unchecked")
public void methodWithScaryWarnings() {
    List rawList = new ArrayList();
    List<String> stringList = (List<String>)rawList;
}

2つの警告を使用する例:

@SuppressWarnings({"unchecked","deprecation"})
public void methodWithScaryWarnings() {
    callDeprecatedMethod();
}

他のヒント

Eclipse 3.5はRawTypesを理解せず、チェックされていない状態に切り替える警告にフラグを立てることに注意してください。 EclipseがRawTypes注釈を思いついたのは、解決よりも多くの問題を引き起こすことをイライラさせます。彼らは標準的なものに固執するべきだったはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top