Programiranje

javačeve možnosti -Xlint

Prevajalnik programskega jezika Java (javac), ki ga ponuja Oracle (in prej Sun), ima več nestandardnih možnosti, ki so pogosto koristne. Ena najbolj uporabnih je nabor nestandardnih možnosti, ki natisnejo opozorila, ki so se pojavila med prevajanjem. Ta sklop možnosti je tema tega prispevka.

Odsek strani javac na seznamih nestandardnih možnosti vsebuje kratke podrobnosti o vsaki od teh možnosti. Sledi ustrezen delček s te strani.

Seznam teh možnosti je na voljo tudi v ukazni vrstici (če je nameščen Java SDK) z ukazom: javac -help -X. To je krajše od zgoraj prikazanega primera strani z informacijami / spletne strani in je prikazano v nadaljevanju.

Kot prejšnji posnetek iz teka javac -pomoč -X kaže, da je deset posebnih pogojev, za katere obstajajo opozorila Xlint (po abecedi): igralska zasedba, zastaranje, divzero, prazno, padejo skozi, končno, preglasi, pot, serijski, in nepreverjeno. Na kratko si ogledam vsako od njih in ponudim delček kode, ki vodi do opozoril, ki se pojavijo, ko je Xlint vklopljen. Upoštevajte, da sta na priročni strani za javac in na strani Java SE 6 na javac navedeni le polovica teh možnosti Xlint (dokumentacija očitno ni tako posodobljena kot uporaba / pomoč za javac). Obstaja uporaben vnos v NetBeans Wiki, ki povzema vseh deset možnosti.

Prevajalnik javac omogoča omogočanje vseh ali nobenega opozorila Xlint. Če Xlint sploh ni podan za možnost -Xlint: nobena ni izrecno podana, vedenje ne bo prikazalo večine opozoril. Zanimivo je, da rezultat vsebuje opozorilo o zastarelih in nepreverjenih opozorilih in priporoča zagon javaca z omogočeno -Xlint, da si ogledate podrobnosti o teh dveh vrstah opozoril.

Pred koncem te objave bom predstavil kodo Java, ki vodi do 13 prijavljenih opozoril Xlint, ki zajemajo vseh deset zgoraj omenjenih možnosti. Če pa Xlint ni določen, je rezultat tak, kot je prikazano na naslednjem posnetku zaslona.

Kot kaže zgornja slika, ali Xlint sploh ni določen ali je izrecno naveden z "nič", je rezultat enak: večina opozoril ni prikazana, obstajajo pa preprosta sklicevanja na zastaranje in nepreverjena opozorila s priporočili za zagon javaca z -Xlint: zastaranje in -Xlint: nepotrjeno za dodatne podrobnosti. Zagon javaca z -Xlint: all ali -Xlint brez drugih možnosti bo prikazal vsa opozorila in si bo ogledal podrobnosti o zastarelih, nepreverjenih in vseh drugih veljavnih opozorilih, ki jih podpira Xlint. To bo prikazano po pregledu izvorne kode in vsakega opozorila Xlint posebej.

-Xlint: igralska zasedba

S to možnostjo lahko prevajalnik opozori razvijalca, da je narejena odvečna oddaja. Tu je delček kode, ki bi bil označen, če bi bil Javac pri prevajanju vira dobavljen -Xlint, -Xlint: all ali -Xlint: cast.

/ ** * Demonstrates -Xlint: opozorilo o predvajanju odvečne zasedbe. * / private static void demonstrateCastWarning () {final Set people = new HashSet (); people.add (fred); people.add (wilma); people.add (barney); for (final Person person: people) {// Odvečna oddaja, ker je generični tip izrecno Person out.println ("Person:" + ((Person) person) .getFullName ()); }} 

V zgornji kodi ni treba oddati predmeta osebe znotraj zanke for na Person in -Xlint: cast bo na to nepotrebno in odvečno oddajo opozoril s sporočilom, ki navaja nekaj takega:

src \ dustin \ examples \ Main.java: 37: opozorilo: [cast] odvečno oddajanje v dustin.examples.Person out.println ("Person:" + ((Person) person) .getFullName ()); ^ 

-Xlint: zastaranje

Kot smo že omenili, se je očitno opozorilo o opuščanju Xlinta štelo za dovolj pomembno, da je upravičeno, da se oglašuje, tudi če Xlint ni izrecno zagnan. To opozorilo se pojavi, ko se prikliče zastarela metoda. Naslednji primer kode prikazuje tak primer.

/ ** * Vzrok -Xlint: opustitev tiskanja opozorila o uporabi zastarele metode. * / private static void demonstrateDeprecationWarning () {out.println ("Fredovo polno ime je" + fred.getName ()); } 

Brez izvorne kode za razred Person ne morete ugotoviti (katerega primer je »fred«), vendar je metoda getName () v osebi zastarela. Naslednji izhod iz zagona javaca z -Xlint, -Xlint: all ali -Xlint: zastarelost to potrdi (ali opozori, če ga je razvijalec zamudil).

src \ dustin \ examples \ Main.java: 47: opozorilo: [zastaranje] getName () v dustin.examples.Person je zastarel out.println ("Fredovo polno ime je" + fred.getName ()); ^ 

-Xlint: divzero

Možnost divzero Xlint označuje, kdaj se integralna delitev deli z dobesedno ničlo. Primer kode, ki bo to prikazal, je prikazan naslednji:

/ ** * Dokažite -Xlint: divzero v akciji tako, da int delite z dobesedno ničlo. * / private static void demonstrateDivideByZeroWarning () {out.println ("Dva deljena z nič je" + divideIntegerByZeroForLongQuotient (2)); } / ** * Predvideni delitelj delite na zagotovljeno dividendo in vrnite * količnik, ki izhaja. Nobena preverjanja niso zagotovljena, da delilec ni enak nič. * * @param dividenda Celo število, ki ga je treba deliti. * @return Količnik delitve dividende z dobesedno ničlo. * / private static long divideIntegerByZeroForLongQuotient (končna int dividenda) {// Trdno kodiran delitelj ničle bo privedel do opozorila. Če bi bil delilec // predan kot parameter z ničlo, to ne bi vodilo do // tega opozorila. donosna dividenda / 0; } 

Zdaj je prikazan izhod iz Javaca, ko je zgoraj zbrano.

src \ dustin \ examples \ Main.java: 231: opozorilo: [divzero] deljenje z ničelno donosno dividendo / 0; ^ 

Ko sem namerno poskušal vsiliti to opozorilo, se mi je zdelo, da deluje le za trdno kodiran (dobesedni) delitelj nič. Prav tako ne označuje dvojne delitve, ker je Infinity v tem primeru mogoče vrniti kot veljaven odgovor brez izjeme.

-Xlint: prazno

Namen -Xlint: prazno je obvestiti razvijalca, da je "prazen" če pogojno je v kodi. Iz mojih testov se zdi, da to velja le za prazen blok "if". NetBeans ponuja "namige" (tista rumeno podčrtana opozorila, ki so označena tudi na desnem robu urejevalnika izvorne kode) za več vrst praznih stavkov, vendar -Xlint: prazno Zdi se, da označuje samo prazne stavke "if". Vključil sem še druge, ki jih NetBeans označuje skupaj z enim -Xlint: prazno zastavice v naslednjem vzorcu izvorne kode.

/ ** * Ta metoda prikazuje, kako deluje Javac -Xlint: empty. Upoštevajte, da bo javačeva * -Xlint: empty označila samo prazen stavek, vključen v blok "if", * vendar ne bo označil praznih stavkov, povezanih z zanko do-while, * zanko while, zanko for ali if -se drugače NetBeans jih označi, če so * vklopljeni ustrezni "Namigi". * / private static void demonstrateEmptyWarning () {int [] cela števila = {1, 2, 3, 4, 5}; če (cela števila.dolžina! = 5); out.println ("Ne pet?"); if (integers.length == 5) out.println ("Pet!"); drugače; out.println ("Ne pet!"); naredi; while (cela števila.dolžina> 0); za (int celo število: cela števila); out.println ("Najdeno je še eno celo število!"); int števec = 0; medtem ko je (števec <5); out.println ("Dodatni podpičji.") ;;;; } 

Zgornja koda je napolnjena s problematično postavitvijo podpičja, ki skoraj zagotovo niso takšna, kot si jih je želel razvijalec. Ta koda se bo zbrala, vendar je razvijalec opozorjen na te sumljive situacije, če -Xlint, -Xlint: vse, ali -Xlint: prazno se uporablja z javac. Naslednja so prikazana opozorilna sporočila, ki so natisnjena v sicer uspešni sestavi.

src \ dustin \ examples \ Main.java: 197: opozorilo: [prazen] prazen stavek po if if (integers.length! = 5); ^ 

Označena je samo prazna klavzula stavka "if"; o ostalih ne poroča -Xlint: prazno.

-Xlint: padec

Mamljiva, a kontroverzna priročnost, ki jo ponuja Java, je zmožnost "prodiranja" skozi pogoste izraze v stikalo izjava za uporabo iste logike za več integralnih vrednosti z enim kosom kode. Če so vse integralne vrednosti s funkcijo v skupni rabi prazne, razen zadnje, ki dejansko izvaja funkcionalnost in zagotavlja a odmor, -Xlint: padec ne bo aktiviran. Če pa nekateri od Ovitek izrazi izvajajo svojo lastno logiko poleg običajne logike padca, se prikaže to opozorilo. Primeri, ki to dokazujejo, so prikazani v nadaljevanju.

/ ** * Vzrok -Xlint: padec za tiskanje opozorila o uporabi stikala / ohišja * padec. * / private static void demonstrateFallthroughWarning () {out.print ("Wilmina najljubša barva je"); out.print (wilma.getFavoriteColor () + ", kar je"); // preverimo, ali je "umetniška" primarna barva // OPOMBA: Ta ne bo privedla do -Xlint: fallthrough, ki označuje opozorilo //, ker nobena funkcija ni vključena v noben stavek o primeru, ki nima lastne odmor. stikalo (wilma.getFavoriteColor ()) {MODRA: velika in majhna črna: rdeča: rdeča: rdeča: out.print ("glavna barva za umetniška prizadevanja"); odmor; ohišje ČRNO: ohišje RJAVO: ohišje CORAL: ohišje JAJČEK: ohišje ZELENO: ohišje MAUVE: ohišje ORANŽNO: ohišje PINK: ohišje PURPLE: ohišje TAN: ohišje BELO: privzeto: out.print ("NI primarna umetniška barva"); } out.print ("in je"); // preverimo, ali je "aditivna" primarna barva // OPOMBA: To stikalo bo privedlo do -Xlint: propad, ki oddaja opozorilo //, ker se v primeru primera // izvaja nekaj funkcij, ki nima lastnega stavka break . stikalo (wilma.getFavoriteColor ()) {modra MODRA: velika črna ZELENA: out.println ("(Zeleno ni lahko!)"); primer RDEČA: out.println ("glavna barva za aditivna prizadevanja."); odmor; ohišje ČRNO: ohišje RJAVO: ohišje CORAL: ohišje EGGSHELL: ohišje MAUVE: ohišje ORANŽNO: ohišje PINK: ohišje PURPLE: ohišje TAN: ohišje RUMENO: ohišje BELO: privzeto: out.println ("NI primarna barva dodatka."); }} 

Zgornji primer kode namerno prikazuje oba primera (namenjena besedam) stikala / ohišja, ki bo in ne bo privedel do opozorilnega sporočila, zahvaljujoč -Xlint: padec skozi. Izhod z samo enim opozorilom je prikazan naprej.

src \ dustin \ examples \ Main.java: 95: opozorilo: [padec] možen prehod v zadevo RDEČA: ^ 

The Ovitek ki je bil označen z RDEČO Ovitek po ZELENI Ovitek ki je naredil nekaj svoje logike, preden se je spustil na RDEČO logiko.

-Xlint: končno

Več kot ena oseba je opozorila: "Ne vračajte se s končno klavzulo." Pravzaprav je "Javaina vrnitev ni vedno" v Javni dvorani sramu. Razvijalca Java lahko z uporabo opozorimo na to grozno situacijo -Xlint, -Xlint: vse, ali -Xlint: končno. V nadaljevanju je prikazan del izvorne kode, ki prikazuje, kako bi lahko ustvarili to opozorilo.

/ ** * Demonstriraj -Xlint: končno generiranje opozorilnega sporočila, ko se blok {@code konačno} * ne more normalno končati. * / private static void demonstrateFinallyWarning () {try {final double quotient = divideIntegersForDoubleQuotient (10, 0); out.println ("Količnik je" + količnik); } catch (RuntimeException un CheckException) {out.println ("Ujeta izjema:" + un CheckException.toString ()); }} / ** * Navedeni delitelj delite na zagotovljeno dividendo in vrnite * količnik, ki izhaja. Nobena preverjanja niso zagotovljena, da delilec ni enak nič. * * @param dividenda Celo število, ki ga je treba deliti. * @param delitelj Celo število, s katerim se deli dividenda. * @return Količnik delitve dividende na delitelj. * / private static double divideIntegersForDoubleQuotient (končna int dividenda, končni int delitelj) {dvojni količnik = 0,0; poskusite {if (delitelj == 0) {vrzi novo ArithmeticException ("Delitev z ničlo ni dovoljena: ni mogoče izvesti" + dividenda + "/" + delitelj); } // To ne bi privedlo do opozorila Xlint: divzero, če bi prišli sem // z dobesednim deliteljem nič, ker bi bil Infinity // preprosto vrnjen, namesto da bi implicitno vrgel ArithmeticException. količnik = (dvojna) dividenda / delitelj; } končno {povratni količnik; }} 

Zgoraj je pomanjkljivo in verjetno ni tisto, kar je razvijal razvijalec. Ustrezni opozorilni javac zagotavlja, ko je Xlint omogočen, je prikazan naslednji.

src \ dustin \ examples \ Main.java: 159: opozorilo: klavzula [končno] na koncu ne more normalno izpolniti} ^ 

-Xlint: preglasi

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