Pilihan javac -Xlint

Penyusun bahasa pengaturcaraan Java (javac) yang disediakan oleh Oracle (dan sebelumnya oleh Sun) mempunyai beberapa pilihan bukan standard yang sering berguna. Salah satu yang paling berguna adalah sekumpulan pilihan bukan standard yang mencetak amaran yang dihadapi semasa penyusunan. Set pilihan itu adalah tajuk siaran ini.

Bahagian halaman javac pada senarai pilihan bukan standard dan memberikan butiran ringkas mengenai setiap pilihan ini. Berikut adalah coretan yang relevan dari halaman tersebut.

Senarai pilihan ini juga tersedia dari baris arahan (dengan asumsi Java SDK dipasang) dengan arahan: javac -help -X. Ini lebih ringkas daripada contoh halaman lelaki / laman web yang ditunjukkan di atas dan ditunjukkan seterusnya.

Sebagai gambar sebelumnya dari berjalan javac -help -Xmenunjukkan, syarat-syarat tertentu sepuluh yang mana amaran Xlint wujud adalah (mengikut abjad): cast, deprecation, divzero, empty, fallthrough, finally, overrides, path, serial, dan unchecked. Secara ringkas saya melihat masing-masing dan memberikan potongan kode yang membawa kepada amaran ini berlaku ketika Xlint dihidupkan. Perhatikan bahawa halaman manual untuk javac dan halaman Java SE 6 javac hanya menyenaraikan separuh daripada pilihan Xlint ini (dokumentasi nampaknya tidak terkini seperti penggunaan / bantuan javac). Terdapat entri NetBeans Wiki yang berguna yang merangkum kesemua sepuluh pilihan.

Penyusun javac membenarkan semua atau tidak ada amaran Xlint diaktifkan. Sekiranya Xlint tidak ditentukan sama sekali pilihan -Xlint: tidak ada yang dinyatakan secara eksplisit, tingkah laku tersebut adalah untuk tidak menunjukkan kebanyakan amaran. Menariknya, output memberikan peringatan mengenai penghentian penggunaan dan peringatan yang tidak dicentang dan mengesyorkan menjalankan javac dengan -Xlint diaktifkan untuk melihat perincian mengenai dua jenis amaran ini.

Sebelum akhir catatan ini, saya akan menunjukkan kod Java yang membawa kepada 13 jumlah amaran Xlint yang dilaporkan merangkumi kesemua sepuluh pilihan yang dibincangkan di atas. Namun, tanpa ditentukan Xlint, outputnya seperti yang ditunjukkan dalam tangkapan skrin seterusnya.

Seperti yang ditunjukkan oleh gambar di atas, sama ada Xlint sama sekali tidak dinyatakan atau dinyatakan secara eksplisit dengan "tidak ada", hasilnya sama: kebanyakan amaran tidak ditunjukkan, tetapi terdapat rujukan mudah untuk peringatan penggunaan dan peringatan yang tidak dicentang dengan cadangan untuk menjalankan javac dengan -Xlint: deprecation dan -Xlint: tidak dicentang masing-masing untuk maklumat tambahan. Menjalankan javac dengan -Xlint: semua atau -Xlint tanpa pilihan lain akan menunjukkan semua amaran dan akan berfungsi untuk melihat perincian berkenaan dengan peringatan yang tidak digunakan, tidak dicentang, dan semua peringatan berkemampuan Xlint yang lain. Ini akan ditunjukkan setelah melalui kod sumber dan setiap amaran Xlint secara individu.

-Xlint: pelakon

Pilihan ini dapat digunakan agar penyusun memberi amaran kepada pembangun bahawa pelakon berlebihan sedang dibuat. Berikut adalah coretan kod yang akan ditandakan jika -Xlint, -Xlint: all, atau -Xlint: cast diberikan kepada javac ketika menyusun sumber.

/** * Demonstrates -Xlint:cast warning of a redundant cast. */ private static void demonstrateCastWarning() { final Set people = new HashSet(); people.add(fred); people.add(wilma); people.add(barney); for (final Person person : people) { // Redundant cast because generic type explicitly is Person out.println("Person: " + ((Person) person).getFullName()); } } 

Dalam kod di atas, tidak perlu membuang objek orang ke dalam loop untuk Person dan -Xlint: cast akan memberi amaran mengenai pelakon yang tidak perlu dan berlebihan ini dengan mesej yang menyatakan seperti:

src\dustin\examples\Main.java:37: warning: [cast] redundant cast to dustin.examples.Person out.println("Person: " + ((Person) person).getFullName()); ^ 

-Xlint: penghentian

Seperti yang dibincangkan di atas, amaran penghentian Xlint terbukti cukup penting untuk membenarkannya diiklankan walaupun Xlint tidak dijalankan secara eksplisit. Amaran ini berlaku apabila kaedah yang digunakan tidak digunakan lagi. Contoh kod berikut menunjukkan kes seperti itu.

/** * Cause -Xlint:deprecation to print warning about use of deprecated method. */ private static void demonstrateDeprecationWarning() { out.println("Fred's full name is " + fred.getName()); } 

Anda tidak dapat memberitahu tanpa kod sumber untuk kelas Person (yang mana "fred" adalah contoh), tetapi kaedah getName () tidak digunakan lagi dalam Person. Keluaran berikut dari menjalankan javac dengan -Xlint, -Xlint: all, atau -Xlint: penghentian mengesahkan bahawa (atau menunjukkannya jika pemaju ketinggalan).

src\dustin\examples\Main.java:47: warning: [deprecation] getName() in dustin.examples.Person has been deprecated out.println("Fred's full name is " + fred.getName()); ^ 

-Xlint: divzero

Pilihan divzero Xlint menunjukkan apabila pembahagian integral membahagi dengan sifar literal. Contoh kod yang akan menunjukkan ini ditunjukkan seterusnya:

/** * Demonstrate -Xlint:divzero in action by dividing an int by a literal zero. */ private static void demonstrateDivideByZeroWarning() { out.println("Two divided by zero is " + divideIntegerByZeroForLongQuotient(2)); } /** * Divide the provided divisor into the provided dividend and return the * resulting quotient. No checks are made to ensure that divisor is not zero. * * @param dividend Integer to be divided. * @return Quotient of division of dividend by literal zero. */ private static long divideIntegerByZeroForLongQuotient(final int dividend) { // Hard-coded divisor of zero will lead to warning. Had the divisor been // passed in as a parameter with a zero value, this would not lead to // that warning. return dividend / 0; } 

Keluaran dari javac ketika di atas disusun kini ditunjukkan.

src\dustin\examples\Main.java:231: warning: [divzero] division by zero return dividend / 0; ^ 

Ketika saya sengaja berusaha untuk memaksa amaran ini, sepertinya hanya berfungsi untuk pembahagi sifar (literal) yang keras. Juga, ia tidak menandakan pembahagian berganda kerana Infinity dapat dikembalikan sebagai jawapan yang sah dalam hal tersebut tanpa membuang pengecualian.

-Xlint: kosong

Tujuannya -Xlint:emptyadalah untuk memberitahu pemaju bahawa ifsyarat "kosong" ada dalam kod. Dari ujian saya, ini nampaknya hanya berlaku untuk kes blok "if" yang kosong. NetBeans memberikan "petunjuk" (peringatan yang digarisbawahi kuning yang juga ditandakan di margin kanan penyunting kod sumber) untuk beberapa jenis pernyataan kosong, tetapi -Xlint:emptynampaknya hanya menandakan pernyataan "jika" yang kosong. Saya memasukkan yang lain yang ditandai oleh NetBeans bersama dengan satu -Xlint:emptybendera dalam contoh kod sumber seterusnya.

/** * This method demonstrates how javac's -Xlint:empty works. Note that javac's * -Xlint:empty will only flag the empty statement involved in the "if" block, * but does not flag the empty statements associated with the do-while loop, * the while loop, the for loop, or the if-else. NetBeans does flag these if * the appropriate "Hints" are turned on. */ private static void demonstrateEmptyWarning() { int[] integers = {1, 2, 3, 4, 5}; if (integers.length != 5); out.println("Not five?"); if (integers.length == 5) out.println("Five!"); else; out.println("Not Five!"); do; while (integers.length > 0); for (int integer : integers); out.println("Another integer found!"); int counter = 0; while (counter < 5); out.println("Extra semicolons.");;;; } 

Kod di atas dipenuhi dengan penempatan titik koma yang bermasalah yang pastinya tidak seperti yang dikehendaki oleh pembangun. Kod ini akan menyusun, tetapi pemaju memberi amaran situasi mencurigakan jika -Xlint, -Xlint:allatau -Xlint:emptydigunakan dengan javac. Mesej amaran yang dicetak dalam kompilasi yang berjaya ditunjukkan seterusnya.

src\dustin\examples\Main.java:197: warning: [empty] empty statement after if if (integers.length != 5); ^ 

Hanya klausa pernyataan "if" yang kosong ditandai; yang lain tidak dilaporkan oleh -Xlint:empty.

-Xlint: kejatuhan

Kemudahan yang menggoda tetapi kontroversial yang disediakan oleh Java adalah kemampuan untuk "meluahkan" ungkapan umum dalam switchpernyataan untuk menerapkan logik yang sama pada beberapa nilai integral dengan satu kod. Sekiranya semua nilai integral dengan fungsi bersama dikosongkan kecuali nilai akhir yang benar-benar menjalankan fungsi dan menyediakannya break, nilai -Xlint:fallthroughtidak akan diaktifkan. Walau bagaimanapun, jika sebilangan caseungkapan melakukan logik sendiri selain daripada logik kejatuhan biasa, amaran ini dihasilkan. Contoh yang menunjukkan ini ditunjukkan seterusnya.

/** * Cause -Xlint:fallthrough to print warning about use of switch/case * fallthrough. */ private static void demonstrateFallthroughWarning() { out.print("Wilma's favorite color is "); out.print(wilma.getFavoriteColor() + ", which is "); // check to see if 'artistic' primary color // NOTE: This one will not lead to -Xlint:fallthrough flagging a warning // because no functionality is included in any of the case statements // that don't have their own break. switch (wilma.getFavoriteColor()) { case BLUE: case YELLOW: case RED: out.print("a primary color for artistic endeavors"); break; case BLACK: case BROWN: case CORAL: case EGGSHELL: case GREEN: case MAUVE: case ORANGE: case PINK: case PURPLE: case TAN: case WHITE: default: out.print("NOT a primary artistic color"); } out.print(" and is "); // check to see if 'additive' primary color // NOTE: This switch WILL lead to -Xlint:fallthrough emitting a warning // because there is some functionality being performed in a case // expression that does not have its own break statement. switch (wilma.getFavoriteColor()) { case BLUE: case GREEN: out.println("(it's not easy being green!) "); case RED: out.println("a primary color for additive endeavors."); break; case BLACK: case BROWN: case CORAL: case EGGSHELL: case MAUVE: case ORANGE: case PINK: case PURPLE: case TAN: case YELLOW: case WHITE: default: out.println("NOT a primary additive color."); } } 

Contoh kod di atas dengan sengaja menunjukkan kedua-dua kes (pun dimaksudkan) suis / kes yang akan dan tidak akan membawa kepada pesanan amaran terima kasih kepada -Xlint:fallthrough. Hasilnya, dengan hanya satu amaran, ditunjukkan seterusnya.

src\dustin\examples\Main.java:95: warning: [fallthrough] possible fall-through into case case RED: ^ 

Yang casediberi bendera adalah MERAH casemengikuti HIJAU caseyang melakukan logik sendiri sebelum jatuh ke logik MERAH.

-Xlint: akhirnya

Lebih dari satu orang telah memberi amaran, "Jangan kembali dalam klausa akhirnya." Sebenarnya, "Kepulangan Java tidak selalu" ada di The Hall Hall of Shame. Seorang pemaju Java boleh diberi amaran mengenai keadaan jahat ini dengan menggunakan -Xlint, -Xlint:allatau -Xlint:finally. Sebilangan kod sumber yang menunjukkan bagaimana amaran ini dapat dihasilkan ditunjukkan seterusnya.

/** * Demonstrate -Xlint:finally generating warning message when a {@code finally} * block cannot end normally. */ private static void demonstrateFinallyWarning() { try { final double quotient = divideIntegersForDoubleQuotient(10, 0); out.println("The quotient is " + quotient); } catch (RuntimeException uncheckedException) { out.println("Caught the exception: " + uncheckedException.toString()); } } /** * Divide the provided divisor into the provided dividend and return the * resulting quotient. No checks are made to ensure that divisor is not zero. * * @param dividend Integer to be divided. * @param divisor Integer by which dividend will be divided. * @return Quotient of division of dividend by divisor. */ private static double divideIntegersForDoubleQuotient(final int dividend, final int divisor) { double quotient = 0.0; try { if (divisor == 0) { throw new ArithmeticException( "Division by zero not allowed: cannot perform " + dividend + "/" + divisor); } // This would not have led to Xlint:divzero warning if we got here // with a literal zero divisor because Infinity would have simply been // returned rather than implicit throwing of ArithmeticException. quotient = (double) dividend / divisor; } finally { return quotient; } } 

Perkara di atas adalah cacat dan kemungkinan bukan yang dimaksudkan oleh pembangun. Javac amaran yang relevan diberikan apabila Xlint diaktifkan ditunjukkan seterusnya.

src\dustin\examples\Main.java:159: warning: [finally] finally clause cannot complete normally } ^ 

-Xlint: menimpa