Apa daftar nama peringatan @SuppressWarnings yang valid di Jawa?

264

Apa daftar @SuppressWarningsnama peringatan yang valid di Jawa?

Bit yang masuk di antara ("")in @SuppressWarnings("").

Ron Tuffin
sumber
3
Pertanyaan ini sangat bagus dan jawabannya sangat berguna. Jika seseorang dari JCP melihatnya, Anda harus menyadari betapa berantakannya menambahkan peringatan penekanan. Tidak ada konvensi tentang kasing, tanda hubung, kasing, hanya berantakan, akan menyenangkan untuk membakukan ini.
Snicolas
Saya melihat di "ProhibitedExceptionDeclared"dalam Kerangka Kerja Koleksi Eclipse ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction), dan itu tidak tercantum di bawah ini.
kevinarpe

Jawaban:

250

Itu tergantung pada IDE atau kompiler Anda.

Berikut adalah daftar untuk Eclipse Galileo:

  • semua untuk menekan semua peringatan
  • tinju untuk menekan peringatan relatif terhadap operasi tinju / unboxing
  • casting untuk menekan peringatan relatif terhadap operasi casting
  • dep-ann untuk menekan peringatan relatif terhadap anotasi yang sudah usang
  • penghentian untuk menekan peringatan relatif terhadap penghentian
  • fallthrough untuk menekan peringatan relatif terhadap jeda yang hilang dalam pernyataan pergantian
  • akhirnya untuk menekan peringatan relatif terhadap akhirnya memblokir yang tidak kembali
  • bersembunyi untuk menekan peringatan relatif terhadap penduduk lokal yang menyembunyikan variabel
  • tidak lengkap-beralih untuk menekan peringatan relatif terhadap entri yang hilang dalam pernyataan beralih (enum case)
  • nls untuk menekan peringatan relatif terhadap string non-nls literal
  • null untuk menekan peringatan relatif terhadap analisis nol
  • pembatasan untuk menekan peringatan relatif terhadap penggunaan referensi yang tidak disarankan atau dilarang
  • serial untuk menekan peringatan relatif terhadap bidang serialVersionUID yang hilang untuk kelas serializable
  • akses statis untuk menekan peringatan relatif terhadap akses statis yang salah
  • sintetis-akses untuk menekan peringatan relatif terhadap akses yang tidak dioptimalkan dari kelas dalam
  • tidak dicentang untuk menekan peringatan relatif terhadap operasi yang tidak dicentang
  • akses bidang-wajar tanpa pengecualian untuk menekan peringatan relatif terhadap akses bidang tidak memenuhi syarat
  • tidak digunakan untuk menekan peringatan relatif terhadap kode yang tidak digunakan

Daftar untuk Indigo menambahkan:

  • javadoc untuk menekan peringatan relatif terhadap peringatan javadoc
  • rawtypes untuk menekan peringatan relatif terhadap penggunaan jenis mentah
  • metode statis untuk menekan peringatan relatif terhadap metode yang dapat dinyatakan sebagai statis
  • super untuk menekan peringatan relatif terhadap mengganti metode tanpa pemanggilan super

Daftar untuk Juno menambahkan:

  • sumber daya untuk menekan peringatan relatif terhadap penggunaan sumber daya tipe Closeable
  • sinkronisasi-timpa untuk menekan peringatan karena tidak ada sinkronisasi saat mengganti metode yang disinkronkan

Kepler dan Luna menggunakan daftar token yang sama dengan Juno ( daftar ).

Yang lain akan serupa tetapi bervariasi.

cletus
sumber
Dalam hal apa menekan peringatan nol berguna?
Jesse Jashinsky
@Jesse: Ketika kompiler salah (yaitu peringatan "'Bodoh Flanders'"). Coba kompilasi: void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Beberapa lingkungan (mis. NetBeans 7.3 w / Java 6 JDK [1.6.0_41]) akan menghasilkan "o possibly null"saat o.toString()panggilan meskipun otidak dapat nol pada saat itu.
par
2
@cletus: Apakah mungkin menambahkan jenis peringatan di gerhana? Masalahnya adalah bahwa salah satu anggota tim kami menggunakan IntelliJ, dan bahwa IDE memiliki jenis peringatan penekan lainnya yang memberikan peringatan di Eclipse :) Di Eclipse Indigo Anda dapat mengatur di preferensi: Abaikan token SuppressWarnings yang tidak digunakan, tetapi tampaknya tidak berhasil ...
KC
semicolonsepertinya tidak bekerja di luna? :( Adakah yang bisa memverifikasi apakah semicolonini benar?
Kissaki
Apa nilai untuk menekan peringatan "sinkronisasi pada bidang non-final"?
matteo
48

Semua nilai diizinkan (yang tidak dikenal diabaikan). Daftar yang dikenali adalah kompiler khusus.

Dalam Tutorial Java unchecked dan deprecationterdaftar sebagai dua peringatan yang diperlukan oleh Spesifikasi Bahasa Java, oleh karena itu, peringatan tersebut harus valid dengan semua kompiler:

Setiap peringatan kompiler termasuk dalam kategori. Spesifikasi Bahasa Jawa mencantumkan dua kategori: penghentian dan tidak dicentang.

Bagian spesifik di dalam Spesifikasi Bahasa Jawa yang didefinisikan tidak konsisten antar versi. Dalam Java SE 8 Spesifikasi uncheckeddan deprecationterdaftar sebagai peringatan kompiler di bagian 9.6.4.5. @SuppressWarnings dan 9.6.4.6 @Drecrecated , masing-masing.

Untuk kompiler Sun, running javac -Xmemberikan daftar semua nilai yang dikenali oleh versi itu. Untuk 1.5.0_17, daftar tampaknya adalah:

  • semua
  • bantahan
  • tidak dicentang
  • gagal
  • jalan
  • serial
  • akhirnya
Martin McNulty
sumber
43

Daftar ini khusus untuk kompiler. Tapi di sini adalah nilai-nilai yang didukung di Eclipse :

  • penghentian semuaDeprecation bahkan di dalam kode usang
  • semuaJavadoc javadoc tidak valid atau hilang
  • assertIdentifier terjadinya assert yang digunakan sebagai pengidentifikasi
  • konversi tinju autoboxing
  • charConcat ketika array char digunakan dalam rangkaian string tanpa dikonversi secara eksplisit menjadi string
  • conditionAssign kemungkinan penugasan boolean yang tidak disengaja
  • metode constructorName dengan nama konstruktor
  • dep-ann hilang anotasi @Deprecated
  • bantahan penggunaan jenis usang atau anggota luar usang kode
  • tidak disarankan menggunakan jenis yang cocok dengan aturan akses yang tidak disarankan
  • emptyBlock blok kosong tidak berdokumen
  • enumSwitch , saklar tidak lengkap saklar enum tidak lengkap
  • fallthrough kemungkinan fall-through case
  • fieldHiding field menyembunyikan variabel lain
  • parameter tipe finalBound dengan batas akhir
  • akhirnya blok tidak selesai secara normal
  • penggunaan terlarang dari jenis yang cocok dengan aturan akses terlarang
  • menyembunyikan makro untuk FieldHiding, localHiding, typeHiding, dan maskCatchBlock
  • indirectStatic, referensi tidak langsung ke anggota statis
  • intfAnnotation annotation type digunakan sebagai antarmuka super
  • antarmuka intfNonInherited kompatibilitas metode non-warisan
  • javadoc javadoc tidak valid
  • localHiding variabel lokal menyembunyikan variabel lain
  • maskedCatchBlocks menangkap blok tersembunyi
  • nls non-nls string literal (kekurangan tag // $ NON-NLS-)
  • tugas noEffectAssign tanpa efek
  • null potensial hilang atau batal cek kosong
  • nullDereferensi tidak ada cek nol
  • over-ann hilang anotasi @Override
  • penugasan paramAssign ke parameter
  • pkgDefaultMethod mencoba menimpa metode paket-default
  • penggunaan baku a dari jenis mentah (bukan jenis parametrized)
  • titik koma titik koma yang tidak perlu atau pernyataan kosong
  • seri serialVersionUID hilang
  • specialParamHiding konstruktor atau parameter setter bersembunyi bidang lain
  • makro akses statis untuk indirectStatic dan staticReceiver
  • staticReceiver jika penerima non-statis digunakan untuk mendapatkan bidang statis atau memanggil metode statis
  • Super menimpa metode tanpa membuat doa super
  • menekan mengaktifkan @SuppressWarnings
  • sintetikAkses, akses-sintetik saat melakukan akses sintetik untuk kelas dalam
  • tugas memungkinkan dukungan untuk tag tugas dalam kode sumber
  • parameter typeHiding type menyembunyikan tipe lain
  • operasi jenis tidak dicentang
  • tidak perluElse klausa lain yang tidak perlu
  • unqualified-field-access, unqualifiedField referensi tidak memenuhi syarat untuk bidang
  • makro yang tidak digunakan untukArkumen yang tidak digunakan , uniImport ,Label yang tidak digunakan, tidak digunakanLokal, tidak terpakaiSelamat dan tidak terpakaiThrown
  • unusedArgument argumen metode yang tidak digunakan
  • unusedImport referensi impor yang tidak digunakan
  • unusedLabel label yang tidak digunakan
  • unusedLocal variabel lokal yang tidak digunakan
  • unusedPrivate deklarasi anggota pribadi yang tidak digunakan
  • unusedThrown yang tidak digunakan menyatakan pengecualian yang dilemparkan
  • uselessTypeCheck operasi cast / instanceof yang tidak perlu
  • argumen varargsCast varargs perlu dilemparkan secara eksplisit
  • warningToken token peringatan tidak tertangani di @SuppressWarnings

Sun JDK (1.6) memiliki daftar peringatan yang didukung lebih pendek :

  • deprecation Periksa penggunaan item yang didepresiasi.
  • tidak dicentang Berikan rincian lebih lanjut untuk peringatan konversi yang tidak dicentang yang dimandatkan oleh Spesifikasi Bahasa Jawa.
  • serial Peringatkan tentang definisi serialVersionUID yang hilang pada kelas serializable.
  • akhirnya Peringatkan tentang akhirnya klausa yang tidak bisa selesai secara normal.
  • fallthrough Periksa blok sakelar untuk kasus fall-through dan berikan pesan peringatan untuk semua yang ditemukan.
  • path Periksa jalur yang tidak ada di jalur lingkungan (seperti classpath).

Javascript terbaru yang tersedia (1.6.0_13) untuk mac memiliki peringatan yang didukung berikut

  • semua
  • Pemeran
  • bantahan
  • divzero
  • kosong
  • tidak dicentang
  • gagal
  • jalan
  • serial
  • akhirnya
  • menimpa
D. Wroblewski
sumber
Daftar Eclipse di sini terlihat untuk mengkompilasi flag dan bukan anotasi SuppressWarning (periksa bagian terakhir dokumen yang Anda tautkan).
Ron Tuffin
3
Mereka berdua. Dengan mengatur flag-flag kompiler Anda memberi tahu kompiler peringatan seperti apa yang Anda inginkan. Dengan anotasi, Anda dapat menekan peringatan ini di tempat tertentu dalam kode Anda.
D. Wroblewski
Saya pikir daftarnya lebih pendek untuk Eclipse. Lihat dokumen galileo terbaru, daftar token yang tersedia untuk SupressWarnings ada di sana: help.eclipse.org/galileo/index.jsp?topic=/…
Peter
2
Saya mencoba @SuppressWarnings ("raw") di Eclipse 3.5 dan tidak berfungsi - saya mendapat peringatan bahwa "raw" bukan nilai yang valid untuk anotasi ini.
Jesper
saya juga. Unfortunatel bahwa dukungan jsp tidak memerah seperti dukungan java.
stu
9

Favorit baru bagi saya adalah @SuppressWarnings("WeakerAccess")di IntelliJ, yang membuatnya tidak mengeluh ketika ia berpikir Anda harus memiliki pengubah akses yang lebih lemah daripada yang Anda gunakan. Kami harus memiliki akses publik untuk beberapa metode untuk mendukung pengujian, dan @VisibleForTestinganotasi tidak mencegah peringatan.

ETA: "Anonim" berkomentar, di halaman @MattCampbell terhubung dengan, catatan yang sangat berguna berikut:

Anda tidak perlu menggunakan daftar ini untuk tujuan yang Anda gambarkan. IntelliJ akan menambahkan SuppressWarnings itu untuk Anda secara otomatis jika Anda memintanya. Telah mampu melakukan ini untuk sebanyak rilis yang saya ingat.

Cukup buka lokasi di mana Anda memiliki peringatan dan ketik Alt-Enter (atau pilih di daftar Inspeksi jika Anda melihatnya di sana). Ketika menu muncul, menunjukkan peringatan dan penawaran untuk memperbaikinya untuk Anda (misalnya jika peringatan itu "Metode mungkin statis" maka "buat statis" adalah tawaran IntellJ untuk memperbaikinya untuk Anda), alih-alih memilih "masuk", cukup gunakan tombol panah kanan untuk mengakses submenu, yang akan memiliki opsi seperti "Edit pengaturan profil inspeksi" dan sebagainya. Di bagian bawah daftar ini akan ada opsi seperti "Menekan semua inspeksi untuk kelas", "Menekan untuk kelas", "Menekan untuk metode", dan kadang-kadang "Menekan untuk pernyataan". Anda mungkin menginginkan salah satu dari daftar ini yang muncul terakhir dalam daftar. Memilih salah satu dari ini akan menambahkan anotasi @SuppressWarnings (atau komentar dalam beberapa kasus) ke kode Anda yang menekan peringatan yang dimaksud. Anda tidak perlu menebak di mana anotasi ditambahkan, karena IntelliJ akan memilih berdasarkan peringatan yang Anda pilih.

barclay
sumber
2

Saya perhatikan bahwa ini //noinspectiondapat dibuat secara otomatis di IntelliJ

  • pastikan Anda belum memiliki rencana @SuppressWarninigssebelum pernyataan
  • Sekarang Anda dapat otomatis menghasilkan spesifik //noinspectiondengan menekan Alt + Enter ketika Anda memiliki peringatan yang dipilih dan kemudian menggunakan tombol panah kanan untuk melihat Menekan untuk ... pilihan

Berakhir di sini ketika saya ingin menekan peringatan "sakelar terlalu sedikit label" dari IntelliJ. Saya tidak menemukan daftar lengkap untuk @SuppressWarningdukungan IntelliJ tetapi //noinspectionmelakukan trik untuk saya.

hb0
sumber
Anda dapat menambahkan @SuppressWarnings ("SwitchStatementWithTooFewBranches") untuk itu juga.
JPM
Sayangnya opsi Supress for ... saat mengklik ALT + ENTER tidak selalu tersedia
flawyte
//noinspection SwitchStatementWithTooFewBranchessebelum switchbekerja juga untuk saya.
Oliver Hausler
1

Dan ini sepertinya daftar yang jauh lebih lengkap, di mana saya menemukan beberapa peringatan khusus untuk Android-Studio yang tidak dapat saya temukan di tempat lain (mis. SynchronizeOnNonFinalField)

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

Oh, sekarang pedoman SO bertentangan dengan pembatasan SO. Di satu sisi, saya seharusnya menyalin daftar daripada hanya menyediakan tautan. Tetapi di sisi lain, ini akan melebihi jumlah karakter maksimum yang diperbolehkan. Jadi semoga saja tautannya tidak rusak.

matteo
sumber
1

JSL 1.7

Dokumentasi Oracle menyebutkan:

  • unchecked: Peringatan yang tidak dicentang diidentifikasi oleh string "tidak dicentang".
  • deprecation: Kompiler Java harus menghasilkan peringatan penghentian ketika tipe, metode, bidang, atau konstruktor yang deklarasinya diberi penjelasan dengan penjelasan @Drecrecated digunakan (yaitu diganti, dipanggil, atau dirujuk dengan nama), kecuali: [...] The gunakan ada di dalam entitas yang dianotasi untuk menekan peringatan dengan anotasi @SuppressWarnings ("deprecation"); atau

Ini kemudian menjelaskan bahwa implementasi dapat menambah dan mendokumentasikan sendiri:

Vendor penyusun harus mendokumentasikan nama peringatan yang didukungnya bersama dengan jenis anotasi ini. Vendor didorong untuk bekerja sama untuk memastikan bahwa nama yang sama berfungsi di banyak kompiler.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
1
Tidak benar bahwa uncheckedsatu-satunya yang didukung oleh standar; bagian berikutnya dari yang Anda kutip mengatakan peringatan penghentian tidak boleh dihasilkan ketika "Penggunaannya ada dalam entitas yang diberi catatan untuk menekan peringatan dengan anotasi @SuppressWarnings("deprecation")"
kbolino
1

Saya hanya ingin menambahkan bahwa ada daftar induk parameter penekan IntelliJ di: https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Terlihat cukup komprehensif. Sebagian:

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
sumber
1

Jika Anda menggunakan SonarLint, coba di atas metode atau kelas seluruh string squid: @SuppressWarnings ("squid: S1172")

R Strauss
sumber