Frage

zog ich in eine neue Maschine, die den neuesten Sun Java-Compiler hat und bemerkt, einige Warnungen in dem bestehenden Java 6-Code. Die Eclipse-IDE, schlug vor, dass ich den Auftrag, mit Anmerkungen versehen mit:

@SuppressWarnings("rawtypes")

Zum Beispiel:

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

Wenn ich mit dem älteren Compiler (JDK 1.6.0_20) zurück in die Maschine bewegt, ich habe bemerkt, dass diese älteren Compiler nun über die Unterdrückung von „rawtypes“ Warnungen warnt, behauptet, dass diese Unterdrückung nicht unterstützt wird und schlägt vor, sie zu ersetzen mit @SuppressWarnings ( "unkontrolliert"). Auch gab es einige Orte, die die neueste Compiler, die standardmäßig hat mich beide „ungeprüft“ zu setzen und „rawtypes“ - diesen Code mit dem älteren Compiler kompiliert gibt die gleiche Warnung

.

Wie kann ich rückwärts / vorwärts Kompatibilität zwischen den beiden erzwingen, so dass weder Compiler erzeugt Warnungen?

War es hilfreich?

Lösung

Sie können die @SuppressWarnings("unchecked") verwenden, die sowohl von der Eclipse-Compiler und javac unterstützt wird.

Aber denken Sie daran die @SuppressWarnings Anmerkung von Ihrem Compiler verwendet wird, die ihre eigenen Werte haben können. Die JLS zwingt nur die Compiler die Werte „nicht markiert“ und „veraltete“ (vorerst) zu verstehen.

  

Compiler-Anbieter die Warn Namen dokumentieren sollte sie in Verbindung mit dieser Anmerkung Typ unterstützen. Sie werden ermutigt, um sicherzustellen, zusammenzuarbeiten, dass die gleichen Namen für mehrere Compiler arbeiten .

Wenn Sie Helios verwenden, müssen Sie eine bestimmte Option setzen @SuppressWarnings("unchecked") statt @SuppressWarnings("rawtypes") zu ermöglichen,

  

Falls es nicht möglich ist, den Code mit dem neuen Token zu aktualisieren, die suppressRawWhenUnchecked=true Systemeigenschaft kann so eingestellt werden, wenn Eclipse-Start.


Ressourcen:


EDIT: Hier ist das jetzt nicht verfügbar Knol-Artikel, die als Referenz verwendet wurde, geschrieben ursprünglich von Alex Miller .

  

@SuppressWarnings Annotation in Java

     

Standard Anmerkung für verschiedene Warnungen unterdrücken

     

Die SuppressWarnings Anmerkung wurde als Standard-Annotation in Java SE hinzugefügt 5.

     

Definition

     

Die @ SuppressWarnings Anmerkung wird in der Java Language Specification Abschnitt 9.6.1.5 . In diesem Abschnitt heißt es:

     
    

Die Annotationstyp SuppressWarnings unterstützt Programmierer die Kontrolle über Warnungen ansonsten durch den Java-Compiler ausgegeben. Es enthält ein einziges Element, das ein Array von String ist. Wenn ein Programm Erklärung mit dem Vermerk @SuppressWarnings(value = {S1, ... , Sk}) kommentiert wird, dann muss ein Java-Compiler keine Warnung durch eine von S1 identifiziert berichten, ..., Sk, wenn diese Warnung würde als Folge der kommentierten Erklärung oder eines seiner Teile erzeugt wurde .

         

Nicht markiert Warnungen identifiziert werden durch die Zeichenfolge "unchecked".

  
     

Der anschließende Abschnitt auf @Deprecation erwähnt auch, dass diese Warnungen mit @SuppressWarnings("deprecation") unterdrückt werden können.

     

Gültige Warnung Typen

     

Die einzigen zwei Warn Strings, die in der Beschreibung erwähnt sind selbst sind „ungeprüft“ und „Geringschätzung“. Jedoch verwendet das Sun JDK eine größere Menge von Zeichenketten in den Compiler. Sie können den aktuellen Satz durch die Ausführung bestimmen:

javac -X
     

, die Ihnen zeigen (unter anderem) die gültigen Einstellungen für -Xlint.

     

Zum Beispiel Sun JDK 1.5 zeigt:

     
      
  • alle - Unterdrückungs alle Warnungen von diesem Code
  •   
  • deprecation - Unterdrückungs-Warnungen aus veralteten Code mit
  •   
  • ungeprüft - Unterdrückungs-Warnungen aus einem ungeprüften Anruf oder einen ungeprüften Guss
  •   
  • fallthrough - Unterdrückungs-Warnungen, wenn ein Schalter fällt durch, ohne einen gültigen Fall zu finden (und keinen Standard)
  •   
  • Pfad -
  •   
  • seriell - Unterdrückungs-Warnungen, wenn eine Serializable Klasse keine serialVersionUID definieren
  •   
  • schließlich - Unterdrückungs-Warnungen Rückkehr innerhalb eines schließlich (was Ignore Rückkehr mit dem Versuch)
  •   
     

Und Sun JDK 1.6 fügt hinzu:

     
      
  • Besetzung
  •   
  • divzero - suppress Warnungen, wenn ganzzahlige Division durch Null detektiert
  •   
  • leer
  •   
  • Überschreibungen
  •   
  • keine
  •   
     

IDEs und statische Analyse-Tools der Regel eine große Anzahl von anderen möglichen Werten für @SuppressWarnings unterstützen. Diese Werte entsprechen bestimmte statische Analyse Kontrollen der IDE.

     

Eclipse-

     

Die Eclipse-Warnwerte für Eclipse 3.3 sind in dem JDT docs dokumentiert .

     
      
  • alle - Unterdrückungs alle Warnungen
  •   
  • Boxen - Unterdrückungs-Warnungen in Bezug auf Boxen / Unboxing-Operationen
  •   
  • Besetzung - Unterdrückungs Warnungen in Bezug auf Guss Operationen
  •   
  • dep-ann - Unterdrückungs-Warnungen in Bezug auf veraltete Anmerkung
  •   
  • deprecation - Unterdrückungs-Warnungen in Bezug auf deprecation
  •   
  • fallthrough - Unterdrückungs-Warnungen in Bezug auf Brüche in switch-Anweisungen fehlt
  •   
  • schließlich - Unterdrückungs-Warnungen bezüglich schließlich zu blockieren, die nicht zurück
  •   
  • Versteck - Unterdrückungs-Warnungen in Bezug auf die Einheimischen, dass verbergen Variable
  •   
  • unvollständig-Schalter - Unterdrückungs-Warnungen in Bezug auf fehlende Einträge in einer switch-Anweisung (Enum Fall)
  •   
  • nls - Unterdrückungs-Warnungen in Bezug auf Nicht-nls Stringliterale
  •   
  • null - Unterdrückungs-Warnungen in Bezug auf null Analyse
  •   
  • Beschränkung - Unterdrückungs-Warnungen in Bezug auf die Verwendung von entmutigten oder verboten Referenzen
  •   
  • seriell - Unterdrückungs-Warnungen bezüglich einer serializable Klasse serialVersionUID Feld fehlt
  •   
  • statisch-Zugang - Unterdrückungs-Warnungen in Bezug auf einem falschen statischen Zugriff
  •   
  • synthetischer Zugang - Unterdrückungs Warnungen in Bezug auf nicht optimierten Zugang von inneren Klassen
  •   
  • ungeprüft - Unterdrückungs Warnungen in Bezug auf unkontrollierte Operationen
  •   
  • unqualifizierte-Feldzugriff - Unterdrückungs Warnungen in Bezug auf Feld Zugang unqualifizierte
  •   
  • ungenutzt - Unterdrückungs Warnungen in Bezug auf nicht verwendeten Code
  •   
     

IntelliJ

     

NetBeans

     

Beispiele

     

Ein Beispiel für eine einzige Warnung Angabe:

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

Ein Beispiel für die Verwendung von zwei Warnungen:

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

Andere Tipps

Beachten Sie, dass Eclipse 3.5 doesnt rawtypes und Fahnen eine Warnung an Schalter ungeprüft verstehen. Es ist frustrierend, dass Eclipse rawtypes Anmerkung kam, die mehr Probleme als Lösung verursacht. Sie sollte nur mit dem Standard fest.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top