Programmēšana

javac's -Xlint opcijas

Oracle (un agrāk Sun) piedāvātajam Java programmēšanas valodas kompilatoram (javac) ir vairākas nestandarta opcijas, kas bieži vien ir noderīgas. Viens no visnoderīgākajiem ir nestandarta opciju kopums, kas izdrukā kompilācijas laikā radušos brīdinājumus. Šis opciju kopums ir šīs ziņas temats.

Javac lapas sadaļā par nestandarta opciju sarakstiem un sniegta īsa informācija par katru no šīm opcijām. Šis ir attiecīgais šīs lapas fragments.

Šo iespēju saraksts ir pieejams arī no komandrindas (pieņemot, ka ir instalēta Java SDK) ar komandu: javac -help -X. Tas ir īsāks nekā iepriekš redzamais manas lapas / tīmekļa lapas piemērs, un tas tiek parādīts nākamais.

Kā iepriekšējais momentuzņēmums no skriešanas javac -palīdzība -X norāda, ka desmit īpašie nosacījumi, par kuriem pastāv Xlint brīdinājumi, ir (alfabētiskā secībā): cast, nolietojums, divzero, tukšs, kritums, beidzot, ignorē, ceļš, sērijveida, un nepārbaudīts. Es īsi aplūkoju katru no šiem un sniedzu koda fragmentu, kas noved pie tā, ka šie brīdinājumi parādās, ieslēdzot Xlint. Ņemiet vērā, ka javac rokasgrāmatā un Java SE 6 javac lapā ir tikai puse no šīm Xlint opcijām (acīmredzot dokumentācija nav tik aktuāla kā javac lietošana / palīdzība). Ir noderīgs NetBeans Wiki ieraksts, kurā apkopotas visas desmit iespējas.

Javac kompilators ļauj iespējot visus Xlint brīdinājumus vai nevienu no tiem. Ja opcija -Xlint: neviena nav skaidri norādīta, Xlint nav norādīts, uzvedība ir tāda, ka netiek rādīta lielākā daļa brīdinājumu. Interesanti, ka izvade sniedz brīdinājumu par nolietojumu un nepārbaudītus brīdinājumus un iesaka palaist javac ar iespējotu -Xlint, lai skatītu detalizētu informāciju par šiem diviem brīdinājumu veidiem.

Pirms šī ieraksta beigām es parādīšu Java kodu, kas noved pie 13 kopējiem Xlint brīdinājumiem, kas aptver visas desmit iepriekš aprakstītās iespējas. Tomēr, nenorādot Xlint, izvade ir tāda, kā parādīts nākamajā ekrāna momentuzņēmumā.

Kā norādīts iepriekš redzamajā attēlā, neatkarīgi no tā, vai Xlint nav norādīts vispār vai ir norādīts tieši ar “none”, rezultāts ir tāds pats: lielākā daļa brīdinājumu netiek parādīti, taču ir vienkāršas norādes uz nolietojumu un nepārbaudīti brīdinājumi ar ieteikumiem lai palaistu javac, izmantojot papildu informāciju, attiecīgi atzīmējiet izvēles rūtiņas -Xlint: deprecation un -Xlint:. Palaižot javac ar -Xlint: visi vai -Xlint bez citām opcijām tiks parādīti visi brīdinājumi, un tas darbosies, lai skatītu detalizētu informāciju par novecojušiem, nepārbaudītiem un visiem citiem piemērojamiem brīdinājumiem, kas iespējoti ar Xlint. Tas tiks parādīts pēc avota koda un katra Xlint brīdinājuma iziešanas atsevišķi.

-Xlint: cast

Šo opciju var izmantot, lai kompilators brīdinātu izstrādātāju, ka tiek veidots lieks dalībnieku sastāvs. Šeit ir koda fragments, kas tiktu atzīmēts, ja, apkopojot avotu, javac tika nodrošināts -Xlint, -Xlint: all vai -Xlint: cast.

/ ** * Demonstrē -Xlint: brīdinājums par lieko sastāvu. * / private static void demonstrētCastWarning () {final Set people = new HashSet (); cilvēki.pievienot (fred); cilvēki.pievienot (wilma); cilvēki.pievienot (bārnijs); par (galīgā persona persona: cilvēki) {// lieks dalībnieku sastāvs, jo vispārīgais veids ir skaidri norādīts Persona out.println ("Persona:" + ((Persona) persona) .getFullName ()); }} 

Iepriekš minētajā kodā personas objekts for loop iekšpusē nav jāraida uz Person un -Xlint: cast brīdinās par šo nevajadzīgo un lieko dalībnieku ar ziņojumu, kurā norādīts kaut kas līdzīgs:

src \ dustin \ piemēri \ Main.java: 37: brīdinājums: [cast] lieks cast to dustin.examples.Person out.println ("Persona:" + ((Persona) persona) .getFullName ()); ^ 

-Xlint: nolietojums

Kā jau tika apspriests iepriekš, brīdinājums par Xlint nolietošanu acīmredzot tika uzskatīts par pietiekami svarīgu, lai attaisnotu tā reklamēšanu pat tad, ja Xlint nav tieši palaists. Šis brīdinājums rodas, kad tiek izmantota novecojusi metode. Šādu gadījumu parāda šāds koda piemērs.

/ ** * Cēlonis -Xlint: nolietojums, lai drukātu brīdinājumu par novecojušās metodes izmantošanu. * / private static void demonstrDeprecationWarning () {out.println ("Freda pilns vārds ir" + fred.getName ()); } 

Jūs nevarat pateikt bez avota koda personai klasei (kuras eksemplārs ir "fred"), taču šī metode getName () ir novecojusi personā. Šāda izeja, darbinot javac ar -Xlint, -Xlint: all vai -Xlint: deprecation, to apstiprina (vai norāda, ja izstrādātājs to nokavēja).

src \ dustin \ piemēri \ Main.java: 47: brīdinājums: [deprecation] getName () sadaļā dustin.examples.Person ir novecojis out.println ("Freda pilns vārds ir" + fred.getName ()); ^ 

-Xlint: divzero

Opcija divzero Xlint norāda, kad integrālais dalījums dalās ar burtisku nulli. Tālāk tiek parādīts koda piemērs, kas to parādīs:

/ ** * Parādiet -Xlint: divzero darbībā, dalot int ar burtisku nulli. * / private static void demonstrētDivideByZeroWarning () {out.println ("Divi dalīti ar nulli ir" + divideIntegerByZeroForLongQuotient (2)); } / ** * Sadaliet norādīto dalītāju paredzētajā dividendē un atgrieziet * iegūto koeficientu. Netiek veiktas pārbaudes, lai pārliecinātos, ka dalītājs nav nulle. * * @param dividend Sadalāmā veselā daļa. * @return Dividenžu dalīšanas koeficients ar burtisko nulli. * / private static long divideIntegerByZeroForLongQuotient (final int dividend) {// Cietā koda nulles dalītājs novedīs pie brīdinājuma. Ja dalītājs // būtu ievadīts kā parametrs ar nulles vērtību, tas nenovedīs pie šī brīdinājuma. peļņas dividendes / 0; } 

Tagad tiek parādīta javac izeja, apkopojot iepriekš minēto.

src \ dustin \ piemēri \ Main.java: 231: brīdinājums: [divzero] dalījums ar nulles peļņas dividenžu / 0; ^ 

Kad es apzināti mēģināju piespiest šo brīdinājumu, šķita, ka tas darbojas tikai ar stingri kodētu (burtiski) nulles dalītāju. Turklāt tas neatzīmē dubulto dalījumu, jo bezgalību tādā gadījumā var atgriezt kā derīgu atbildi, neizmetot izņēmumu.

-Xlint: tukšs

Mērķis -Xlint: tukšs ir paziņot izstrādātājam, ka "tukšs" ja nosacījums ir kodā. Pēc maniem testiem tas, šķiet, attiecas tikai uz tukšā "ja" bloka gadījumu. NetBeans nodrošina "padomus" (tos dzeltenus pasvītrotos brīdinājumus, kas ir atzīmēti arī avota koda redaktora labajā malā) vairāku veidu tukšiem paziņojumiem, taču -Xlint: tukšs šķiet, ka atzīmē tikai tukšos paziņojumus “ja”. Es iekļāvu pārējos, kurus NetBeans atzīmē kopā ar vienu -Xlint: tukšs karodziņi nākamajā avota koda paraugā.

/ ** * Šī metode parāda, kā darbojas javac -Xlint: empty. Ņemiet vērā, ka javac's * -Xlint: empty atzīmēs tikai tukšo paziņojumu, kas iesaistīts blokā "ja" *, bet neatzīmē tukšos paziņojumus, kas saistīti ar ciklu do-while, * while cilpu, for ciklu vai if -cita. NetBeans tos atzīmē, ja * ir ieslēgti atbilstošie "padomi". * / private static void demonstrētEmptyWarning () {int [] veseli skaitļi = {1, 2, 3, 4, 5}; ja (veseli skaitļi.garums! = 5); out.println ("Nav pieci?"); if (veseli skaitļi.garums == 5) out.println ("Pieci!"); cits; out.println ("Nav pieci!"); darīt; while (veseli skaitļi.garums> 0); for (int vesels skaitlis: veseli skaitļi); out.println ("Atrasts vēl viens vesels skaitlis!"); int skaitītājs = 0; kamēr (skaitītājs <5); out.println ("Papildu semikoli.") ;;;; } 

Iepriekš minētais kods ir piepildīts ar problemātisku semikolu izvietojumu, kas gandrīz noteikti nav tas, ko izstrādātājs vēlējās. Šis kods tiks apkopots, taču izstrādātājs tiek brīdināts par šīm aizdomīgajām situācijām, ja -Xlint, -Xlint: vissvai -Xlint: tukšs tiek izmantots ar javac. Brīdinājuma ziņojumi, kas tiek izdrukāti citādi veiksmīgā kompilācijā, tiek parādīti tālāk.

src \ dustin \ piemēri \ Main.java: 197: brīdinājums: [tukšs] tukšs paziņojums pēc ja ja (veseli skaitļi.garums! = 5); ^ 

Atzīmēta tikai tukšā paziņojuma klauzula "ja"; par pārējiem nav ziņojis -Xlint: tukšs.

-Xlint: kritums

Kārdinoša, bet pretrunīgi vērtējama ērtība, ko Java nodrošina, ir spēja "pārspēt" parastos izteicienus a slēdzis paziņojumu, lai izmantotu to pašu loģiku vairākām integrālām vērtībām ar vienu koda daļu. Ja visas neatņemamās vērtības ar koplietojamo funkcionalitāti ir tukšas, izņemot pēdējo, kas faktiski veic funkcionalitāti un nodrošina a pārtraukums, -Xlint: kritums netiks aktivizēts. Tomēr, ja daži no gadījumā izteiksmes veic savu loģiku papildus parastajai novirzes loģikai, šis brīdinājums tiek izveidots. Tālāk parādīti piemēri, kas to demonstrē.

/ ** * Cēlonis -Xlint: brīdinājums par drukas brīdinājumu par slēdža / korpusa izmantošanu * kritums. * / private static void demonstrētFallthroughWarning () {out.print ("Vilmas iecienītākā krāsa ir"); out.print (wilma.getFavoriteColor () + ", kas ir"); // pārbaudiet, vai primārā krāsa ir „mākslinieciska” // PIEZĪME. Šis nenovedīs pie -Xlint: kritiena brīdinājuma atzīmēšana // jo nevienā no gadījuma paziņojumiem nav iekļauta neviena funkcionalitāte pārtraukums. slēdzis (wilma.getFavoriteColor ()) {case BLUE: case YELLOW: case RED: out.print ("galvenā krāsa mākslinieciskiem centieniem"); pārtraukums; korpuss BLACK: korpuss BROWN: korpuss CORAL: korpuss EGGSHELL: korpuss GREEN: korpuss MAUVE: korpuss ORANGE: korpuss PINK: korpuss PURPLE: korpuss TAN: korpuss BALTS: noklusējums: out.print ("NAV galvenā mākslinieciskā krāsa"); } out.print ("un ir"); // pārbaudiet, vai primārā krāsa ir “piedeva” // PIEZĪME: Šis slēdzis novedīs pie -Xlint: kritums, kas izstaro brīdinājumu // tāpēc, ka gadījumā tiek veikta kāda funkcionalitāte // izteiksme, kurai nav sava pārtraukuma paziņojuma . slēdzis (wilma.getFavoriteColor ()) {case BLUE: case GREEN: out.println ("(zaļi būt nav viegli!)"); gadījums RED: out.println ("primārā krāsa piedevu centieniem."); pārtraukums; 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 ("NAV primārā piedevas krāsa."); }} 

Iepriekš minētais koda piemērs ar nodomu parāda abus slēdža / lietas gadījumus (paredzēts pun), kas novedīs pie un nenovedīs pie brīdinājuma ziņojuma, pateicoties -Xlint: kritums. Tālāk tiek parādīta izeja ar tikai vienu brīdinājumu.

src \ dustin \ piemēri \ Main.java: 95: brīdinājums: [kritums] iespējama nokrišana gadījumā RED: ^ 

The gadījumā kas tika atzīmēts ar karodziņu, bija RED gadījumā sekojot ZAĻAI gadījumā tas izdarīja kādu savu loģiku, pirms pārgāja uz RED loģiku.

-Xlint: beidzot

Vairāk nekā viena persona ir brīdinājusi: "Neatgriezieties galīgajā klauzulā." Faktiski "Java atgriešanās ne vienmēr" atrodas Java kauna zālē. Java izstrādātāju var brīdināt par šo slikto situāciju, izmantojot -Xlint, -Xlint: vissvai -Xlint: beidzot. Tālāk tiek parādīts avota koda fragments, kas parāda, kā šis brīdinājums varētu tikt ģenerēts.

/ ** * Parādiet -Xlint: beidzot tiek ģenerēts brīdinājuma ziņojums, ja {@code beidzot} * bloks nevar normāli beigties. * / private static void demonstrētFinallyWarning () {mēģiniet {galīgais dubultā koeficients = divideIntegersForDoubleQuotient (10, 0); out.println ("koeficients ir" + koeficients); } catch (RuntimeException uncheckedException) {out.println ("Noķerts izņēmums:" + uncheckedException.toString ()); }} / ** * Sadaliet norādīto dalītāju paredzētajā dividenžā un atgrieziet * iegūto koeficientu. Netiek veiktas pārbaudes, lai pārliecinātos, ka dalītājs nav nulle. * * @param dividend Sadalāmā veselā daļa. * @param divisor Vesels skaitlis, ar kuru dividendes tiks sadalītas. * @return Dividenžu dalīšanas koeficients pēc dalītāja. * / privātā statiskā dubultā dalīšanaIntegersForDoubleQuotient (galīgā int dividende, galīgā int dalītāja) {dubultā koeficients = 0.0; mēģiniet {if (dalītājs == 0) {mest jaunu ArithmeticException ("Dalīšana ar nulli nav atļauta: nevar izpildīt" + dividende + "/" + dalītājs); } // Tas nebūtu novedis pie Xlint: divzero brīdinājuma, ja mēs nokļūtu šeit // ar burtisku nulles dalītāju, jo Bezgalība būtu vienkārši atgriezta // nevis netieša ArithmeticException mešana. koeficients = (dubultā) dividende / dalītājs; } beidzot {atgriešanās koeficients; }} 

Iepriekš minētais ir kļūdains un, visticamāk, nav tas, ko izstrādātājs ir iecerējis. Nākamais tiek parādīts atbilstošais brīdinājums, kas tiek rādīts, kad javlack tiek parādīts, kad Xlint ir iespējots.

src \ dustin \ piemēri \ Main.java: 159: brīdinājums: [beidzot] klauzula beidzot nevar normāli aizpildīt} ^ 

-Xlint: ignorē

$config[zx-auto] not found$config[zx-overlay] not found