Jaka jest lista prawidłowych nazw ostrzegawczych @SuppressWarnings w Javie?

264

Jaka jest lista ważnych @SuppressWarnings nazw ostrzegawczych w Javie?

Bit, który przychodzi w między ("")in @SuppressWarnings("").

Ron Tuffin
źródło
3
To pytanie jest naprawdę miłe, a odpowiedzi są przydatne. Jeśli ktoś z JCP na to spojrzy, powinieneś zdać sobie sprawę, jak niechlujne jest dodanie ostrzeżenia o wyłączeniu. Nie ma konwencji dotyczącej skrzynki, łącznika, skrzynki na wielbłąda, to zwykły bałagan, fajnie byłoby ujednolicić to.
Snicolas,
Widzę "ProhibitedExceptionDeclared"w Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction) i nie jest to wymienione poniżej.
kevinarpe

Odpowiedzi:

250

To zależy od twojego IDE lub kompilatora.

Tutaj jest lista dla Eclipse Galileo:

  • wszystko, aby ukryć wszystkie ostrzeżenia
  • boks, aby ukryć ostrzeżenia związane z operacjami boksowania / rozpakowywania
  • rzutowanie, aby ukryć ostrzeżenia związane z operacjami rzutowania
  • dep-ann aby ukryć ostrzeżenia dotyczące przestarzałej adnotacji
  • dezaprobata aby ukryć ostrzeżenia związane z wycofaniem
  • upadek ostrzeżeń dotyczących brakujących przerw w instrukcjach przełączania
  • Wreszcie aby ukryć ostrzeżenia w stosunku do w końcu bloku, który nie powraca
  • ukrywanie aby ukryć ostrzeżenia dotyczące mieszkańców, którzy ukrywają zmienne
  • niekompletny przełącznik aby ukryć ostrzeżenia dotyczące brakujących wpisów w instrukcji switch (przypadek enum)
  • nls aby ukryć ostrzeżenia dotyczące literałów łańcuchowych innych niż nls
  • zero aby ukryć ostrzeżenia związane z analizą null
  • ograniczenie do zniesienia ostrzeżeń związanych z używaniem zniechęconych lub zabronionych odnośników
  • seryjny aby ukryć ostrzeżenia dotyczące brakującego pola serialVersionUID dla klasy możliwej do serializacji
  • dostęp statyczny aby ukryć ostrzeżenia związane z niepoprawnym dostępem statycznym
  • syntetyczny dostęp do tłumienia ostrzeżeń dotyczących niezoptymalizowanego dostępu z klas wewnętrznych
  • niezaznaczone, aby ukryć ostrzeżenia związane z niezaznaczonymi operacjami
  • Unqualified-Field-Access, aby ukryć ostrzeżenia dotyczące dostępu do pola Unqualified
  • nieużywane, aby ukryć ostrzeżenia dotyczące nieużywanego kodu

Lista dla Indigo dodaje:

  • javadoc, aby ukryć ostrzeżenia związane z ostrzeżeniami javadoc
  • typy raw, aby ukryć ostrzeżenia związane z użyciem typów raw
  • metoda statyczna do tłumienia ostrzeżeń w stosunku do metod, które można zadeklarować jako statyczne
  • super, aby ukryć ostrzeżenia dotyczące zastępowania metody bez super wywołań

Lista dla Juno dodaje:

  • zasób, aby ukryć ostrzeżenia związane z wykorzystaniem zasobów typu Zamykalny
  • synchronizacja-pomijanie, aby ukryć ostrzeżenia z powodu braku synchronizacji podczas zastępowania metody synchronizowanej

Kepler i Luna używają tej samej listy znaczników, co Juno ( lista ).

Inne będą podobne, ale różnią się.

Cletus
źródło
W jakich przypadkach przydatne byłoby wyłączenie ostrzeżenia zerowego?
Jesse Jashinsky
@Jesse: Gdy kompilator się pomyli (tzn. „Ostrzeżenie o głupiej Flandrii”). Spróbuj kompilacji: void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Niektóre środowiska (np. NetBeans 7.3 z JDK Java 6 [1.6.0_41]) generują "o possibly null"podczas o.toString()połączenia, nawet jeśli ow tym momencie nie mogą być puste.
par
2
@cletus: Czy można dodawać typy ostrzeżeń do zaćmienia? Problem polega na tym, że jeden z członków naszego zespołu używa IntelliJ, a IDE ma inne typy ostrzeżeń suppress, które dają ostrzeżenia w Eclipse :) W Eclipse Indigo możesz ustawić preferencje: Ignoruj ​​nieużywane tokeny SuppressWarnings, ale to nie działa ...
KC
semicolonnie wydaje się działać w luna? :( Czy ktoś może sprawdzić, czy semicolonrzeczywiście jest poprawny?
Kissaki,
Jaka jest wartość tłumienia ostrzeżenia „synchronizacja w polu innym niż końcowe”?
matteo,
48

Wszystkie wartości są dozwolone (nierozpoznane są ignorowane). Lista rozpoznawanych jest specyficzna dla kompilatora.

W Java Poradniki unchecked i deprecationsą wymienione jako dwóch ostrzeżeń wymaganych w specyfikacji języka Java, dlatego powinny one być ważne ze wszystkimi kompilatorów:

Każde ostrzeżenie kompilatora należy do kategorii. Specyfikacja języka Java wymienia dwie kategorie: wycofanie i niezaznaczone.

Określone sekcje w specyfikacji języka Java, w których są zdefiniowane, nie są spójne między wersjami. W Java SE 8 specyfikacji uncheckedi deprecationsą oznaczone jako kompilator w sekcji 9.6.4.5. @SuppressWarnings i 9.6.4.6 @Deprecated , odpowiednio.

Dla kompilatora firmy Sun działający javac -X daje listę wszystkich wartości rozpoznawanych przez tę wersję. W przypadku wersji 1.5.0_17 wygląda na to, że:

  • wszystko
  • dezaprobata
  • niepowstrzymany
  • upadek
  • ścieżka
  • seryjny
  • Wreszcie
Martin McNulty
źródło
43

Lista jest specyficzna dla kompilatora. Ale oto wartości obsługiwane w Eclipse :

  • wycofanie allDeprecation nawet w nieaktualnym kodzie
  • allJavadoc jest niepoprawny lub brakuje javadoc
  • assertIdentifier wystąpienie assert używanego jako identyfikator
  • bokserska konwersja autoboxingu
  • charConcat gdy tablica char jest używana w konkatenacji łańcucha bez konieczności jawnej konwersji na łańcuch
  • warunek Przypisz możliwe przypadkowe przypisanie wartości logicznej
  • constructorName metoda o nazwie konstruktora
  • dep-ann brakuje @Deprecated adnotation
  • przestarzałe użycie przestarzałego typu lub elementu spoza przestarzałego kodu
  • odradza się używanie typów pasujących do reguły odradzanego dostępu
  • emptyBlock nieudokumentowany pusty blok
  • enumSwitch , niekompletny przełącznik niekompletny przełącznik enum
  • możliwy wypadek awaryjny
  • fieldHiding pole ukrywa inną zmienną
  • finalBound parametr typu z ostatecznym ograniczeniem
  • Wreszcie blok nie kończy się normalnie
  • zakazana użycie typów pasujących do reguły zabronionego dostępu
  • ukrywanie makra dla fieldHiding, localHiding, typeHiding i maskedCatchBlock
  • niebezpośredni odniesienie pośrednie do elementu statycznego
  • intfAnnotation typ adnotacji używany jako super interfejs
  • intfNonInherited interfejs kompatybilność z dziedziczonymi metodami
  • javadoc niepoprawny javadoc
  • localHiding zmienna lokalna ukrywa inną zmienną
  • maskedCatchBlocks ukryty blok catch
  • nls literały ciągów nie-nls (brak tagów // $ NON-NLS-)
  • noEffectAssign przypisanie bez efektu
  • brak potencjału zerowego lub nadmiarowy test zerowy
  • nullDereference brakuje kontroli zerowej
  • nadmiernie brakująca adnotacja @Override
  • param Przypisz przypisanie do parametru
  • pkgDefaultMethod próbuje zastąpić domyślną metodę pakietu
  • surowe użycie typu surowego (zamiast sparametryzowanego)
  • średnik niepotrzebny średnik lub pusta instrukcja
  • brak seryjny serialVersionUID
  • specialParamHiding konstruktor lub parametr ustawiający ukrywający inne pole
  • makro z dostępem statycznym dla pośredniegoStatic i staticReceiver
  • staticReceiver jeśli do uzyskania pola statycznego lub wywołania metody statycznej używany jest odbiornik niestatyczny
  • super zastępuje metodę bez wykonywania super wywołania
  • tłumić umożliwić @SuppressWarnings
  • syntheticAccess, dostęp syntetyczny podczas wykonywania dostępu syntetycznego dla klasy wewnętrznej
  • zadania włączają obsługę znaczników zadań w kodzie źródłowym
  • typeHiding parametr typu ukrywanie innego typu
  • niezaznaczona operacja niezaznaczonego typu
  • unnecessaryElse niepotrzebna klauzula else
  • unqualified-field-access, unqualifiedField bez zastrzeżeń odniesienie do pola
  • nieużywane makro dla unusedArgument, unusedImport, unusedLabel, unusedLocal, nieużywanePrywatne i nieużywane
  • unusedArgument argument nieużywanej metody
  • unusedImport niewykorzystane odniesienia importu
  • unusedLabel nieużywany etykieta
  • unusedLocal nieużywana zmienna lokalna
  • unusedPrywatna nieużywana deklaracja członka prywatnego
  • unused Zgłaszany nieużywany zadeklarowany wyjątek
  • uselessType Sprawdź niepotrzebne operacje rzutowania / instanceof
  • Argument varargsCast varargs wymaga jawnej obsady
  • warningToken nieobsługiwany token ostrzegawczy w @SuppressWarnings

Sun JDK (1.6) ma krótszą listę obsługiwanych ostrzeżeń:

  • dezaprobata Sprawdź wykorzystania zamortyzowanych przedmiotów.
  • niezaznaczony Podaj więcej szczegółów dla niezaznaczonych ostrzeżeń o konwersji, które są wymagane przez specyfikację języka Java.
  • serial Ostrzegaj o brakujących definicjach serialVersionUID w klasach możliwych do serializacji.
  • w końcu Ostrzeż o klauzulach, które nie mogą zostać wypełnione normalnie.
  • fallthrough Sprawdź bloki przełączników pod kątem przypadków awaryjnych i podaj komunikat ostrzegawczy dla wszystkich znalezionych.
  • ścieżka Sprawdź, czy nie ma ścieżki w ścieżkach środowiska (takich jak ścieżka klasy).

Najnowsze dostępne javac (1.6.0_13) dla komputerów Mac mają następujące obsługiwane ostrzeżenia

  • wszystko
  • odlew
  • dezaprobata
  • divzero
  • pusty
  • niepowstrzymany
  • upadek
  • ścieżka
  • seryjny
  • Wreszcie
  • zastępuje
D. Wróblewski
źródło
Lista Eclipse wygląda tutaj na flagi kompilatora, a nie na adnotacjach SuppressWarning (sprawdź ostatnią część dokumentu, do którego dowiązałeś).
Ron Tuffin,
3
Oboje są. Ustawiając flagi kompilatora, informujesz kompilator, jakiego rodzaju ostrzeżenia chcesz. Za pomocą adnotacji możesz ukryć te ostrzeżenia w określonych miejscach w kodzie.
D. Wróblewski
Myślę, że lista jest krótsza dla Eclipse. Zobacz najnowsze dokumenty Galileo, lista dostępnych tokenów dla SupressWarnings jest tam wyraźna: help.eclipse.org/galileo/index.jsp?topic=/…
Peter Štibraný
2
Próbowałem @SuppressWarnings („raw”) w Eclipse 3.5 i to nie działa - otrzymuję ostrzeżenie, że „raw” nie jest poprawną wartością dla tej adnotacji.
Jesper,
Ja też. Niestety, obsługa JSP nie jest tak wyparta jak obsługa Javy.
stu
9

Nową ulubioną rzeczą jest dla mnie @SuppressWarnings("WeakerAccess")IntelliJ, który nie pozwala na narzekać, kiedy uważa, że ​​powinieneś mieć słabszy modyfikator dostępu niż używasz. Musimy mieć publiczny dostęp do niektórych metod wspierania testów, a @VisibleForTestingadnotacja nie zapobiega ostrzeżeniom.

ETA: „Anonimowy” skomentował na stronie @MattCampbell połączonej z następującą niezwykle przydatną notatką:

Nie powinieneś używać tej listy do opisywanego celu. IntelliJ doda te SuppressWarnings automatycznie, jeśli o to poprosisz. Był w stanie to zrobić dla tylu wydań, ile pamiętam.

Po prostu przejdź do lokalizacji, w której masz ostrzeżenie i wpisz Alt-Enter (lub wybierz je z listy Inspekcje, jeśli je tam widzisz). Kiedy pojawi się menu, wyświetla ostrzeżenie i oferuje możliwość naprawy go (np. Jeśli ostrzeżenie to „Metoda może być statyczna”, to „make static” jest ofertą IntellJ, aby to naprawić), zamiast wybierania „enter”, wystarczy użyć przycisku strzałki w prawo, aby przejść do podmenu, które będzie zawierało opcje takie jak „Edytuj ustawienia profilu inspekcji” i tak dalej. U dołu tej listy znajdują się opcje takie jak „Pomiń wszystkie inspekcje dla klasy”, „Pomiń dla klasy”, „Pomiń dla metody”, a czasami „Pomiń dla instrukcji”. Prawdopodobnie chcesz, którykolwiek z nich pojawi się jako ostatni na liście. Wybranie jednego z nich spowoduje dodanie adnotacji @SuppressWarnings (lub komentarza w niektórych przypadkach) do kodu z pominięciem danego ostrzeżenia. Nie musisz zgadywać, do której adnotacji dodać, ponieważ IntelliJ wybierze na podstawie wybranego ostrzeżenia.

barclay
źródło
2

Zauważyłem, że //noinspectionmożna go wygenerować automatycznie w IntelliJ

  • upewnij się, że nie masz jeszcze planu @SuppressWarninigsprzed wyciągiem
  • Teraz możesz automatycznie wygenerować konkretny //noinspection, naciskając Alt + Enter, gdy masz ostrzeżenie, a następnie użyj klawisza strzałki w prawo, aby wyświetlić opcję Pomiń dla ...

Skończyło się tutaj, gdy chciałem ukryć ostrzeżenie „przełącznik ma za mało etykiet” z ostrzeżeniem IntelliJ. Nie znalazłem pełnej listy @SuppressWarningwsparcia IntelliJ, ale //noinspectionzrobiłem to dla mnie.

hb0
źródło
Możesz również dodać @SuppressWarnings („SwitchStatementWithTooFewBranches”).
JPM
Niestety opcja Pomiń dla ... po kliknięciu ALT + ENTER nie zawsze jest dostępna
flawyte
//noinspection SwitchStatementWithTooFewBranchesprzed switchdziała tak samo dla mnie.
Oliver Hausler
1

Wydaje się, że jest to o wiele bardziej kompletna lista, na której znalazłem ostrzeżenia specyficzne dla Androida-Studio, których nie mogłem znaleźć gdzie indziej (np. SynchronizeOnNonFinalField)

https://jazzy.id.au/2008/10/30/list_of_suppresswarnings_arguments.html

Och, teraz wytyczne SO są sprzeczne z ograniczeniami SO. Z jednej strony mam raczej skopiować listę, niż podać tylko link. Ale z drugiej strony przekroczyłoby to maksymalną dozwoloną liczbę znaków. Miejmy więc nadzieję, że link się nie zepsuje.

matteo
źródło
1

JSL 1.7

Dokumentacja Oracle wspomina:

  • unchecked: Niesprawdzone ostrzeżenia są identyfikowane przez ciąg „niezaznaczone”.
  • deprecation: Kompilator Java musi wygenerować ostrzeżenie o wycofaniu, gdy zostanie użyty typ, metoda, pole lub konstruktor, którego deklaracja jest opatrzona adnotacją @Deprecated (tzn. Zastąpiona, wywołana lub przywołana przez nazwę), chyba że: [...] użycie znajduje się w jednostce, która jest opatrzona adnotacjami, aby ukryć ostrzeżenie za pomocą adnotacji @SuppressWarnings („wycofanie”); lub

Następnie wyjaśnia, że ​​implementacje mogą dodawać i dokumentować własne:

Dostawcy kompilatorów powinni udokumentować obsługiwane przez nich nazwy ostrzeżeń w połączeniu z tym typem adnotacji. Zachęca się dostawców do współpracy w celu zapewnienia, że ​​te same nazwy działają w wielu kompilatorach.

Ciro Santilli
źródło
1
Nie jest prawdą, że uncheckedjest to jedyna rekomendowana przez standard; w następnej sekcji od cytowanej przez ciebie napisano, że ostrzeżenia o rezygnacji nie powinny być generowane, gdy „Wykorzystanie dotyczy jednostki, która ma adnotację w celu zniesienia ostrzeżenia za pomocą adnotacji @SuppressWarnings("deprecation")
kbolino 16.10.16
1

Chcę tylko dodać, że istnieje główna lista parametrów pomijania IntelliJ pod adresem : https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Wygląda dość kompleksowo. Częściowy:

Warning Description - Warning Name

"Magic character" MagicCharacter 
"Magic number" MagicNumber 
'Comparator.compare()' method does not use parameter ComparatorMethodParameterNotUsed 
'Connection.prepare*()' call with non-constant string JDBCPrepareStatementWithNonConstantString 
'Iterator.hasNext()' which calls 'next()' IteratorHasNextCallsIteratorNext 
'Iterator.next()' which can't throw 'NoSuchElementException' IteratorNextCanNotThrowNoSuchElementException 
'Statement.execute()' call with non-constant string JDBCExecuteWithNonConstantString 
'String.equals("")' StringEqualsEmptyString 
'StringBuffer' may be 'StringBuilder' (JDK 5.0 only) StringBufferMayBeStringBuilder 
'StringBuffer.toString()' in concatenation StringBufferToStringInConcatenation 
'assert' statement AssertStatement 
'assertEquals()' between objects of inconvertible types AssertEqualsBetweenInconvertibleTypes 
'await()' not in loop AwaitNotInLoop 
'await()' without corresponding 'signal()' AwaitWithoutCorrespondingSignal 
'break' statement BreakStatement 
'break' statement with label BreakStatementWithLabel 
'catch' generic class CatchGenericClass 
'clone()' does not call 'super.clone()' CloneDoesntCallSuperClone
Matt Campbell
źródło
1

Jeśli używasz SonarLint, wypróbuj metodę lub klasę całego łańcucha kalmarów: @SuppressWarnings („squid: S1172”)

R Strauss
źródło