Programavimas

„javac's -Xlint“ parinktys

„Oracle“ (ir anksčiau „Sun“) pateiktame „Java“ programavimo kalbos kompiliatoriuje (javac) yra keletas nestandartinių parinkčių, kurios dažnai yra naudingos. Vienas iš naudingiausių yra nestandartinių parinkčių rinkinys, išspausdinantis kompiliavimo metu pastebėtus įspėjimus. Šis galimybių rinkinys yra šio įrašo tema.

„Javac“ puslapio skyriuje apie nestandartinių parinkčių sąrašus ir pateikiama trumpa informacija apie kiekvieną iš šių parinkčių. Toliau pateikiamas atitinkamas to puslapio fragmentas.

Šias parinktis taip pat galima rasti komandinėje eilutėje (darant prielaidą, kad įdiegtas „Java SDK“) su komanda: javac -help -X. Tai yra trumpiau nei aukščiau pateiktas žmogaus puslapio / tinklalapio pavyzdys ir rodomas toliau.

Kaip ankstesnis momentinis vaizdas iš bėgimo javac -pagalba -X nurodoma, kad dešimt specialių sąlygų, kurioms taikomi „Xlint“ įspėjimai, yra (abėcėlės tvarka): mesti, nuvertėjimas, divzero, tuščia, prasiveržimas, pagaliau, nepaiso, kelias, serijinisir nepatikrinta. Trumpai apžvelgiu kiekvieną iš jų ir pateikiu kodo fragmentą, kuris nurodo, kad šis įspėjimas įvyksta įjungus „Xlint“. Atkreipkite dėmesį, kad „javac“ vartotojo puslapyje ir „Java SE 6 javac“ puslapyje pateikiama tik pusė šių „Xlint“ parinkčių (dokumentai, matyt, nėra tokie atnaujinti, kaip „javac“ naudojimas / žinynas). Yra naudingas „NetBeans Wiki“ įrašas, kuriame apibendrinamos visos dešimt parinkčių.

„Javac“ kompiliatorius leidžia įjungti visus „Xlint“ įspėjimus arba jų nebevykdyti. Jei „Xlint“ visiškai nenurodoma - „Xlint“: nė vienas nėra aiškiai nurodytas, daugumos įspėjimų negalima rodyti. Įdomu tai, kad išvestyje pateikiamas įspėjimas apie nusidėvėjimą ir nepatikrintus įspėjimus ir rekomenduojama paleisti „javac“ su įjungta funkcija „-Xlint“, kad būtų pateikta išsami informacija apie šiuos du įspėjimų tipus.

Iki šio įrašo pabaigos aš pademonstruosiu „Java“ kodą, kuris veda prie 13 iš viso praneštų „Xlint“ įspėjimų, apimančių visas dešimt anksčiau aptartų parinkčių. Tačiau nenurodžius „Xlint“, išvestis yra tokia, kaip parodyta kitame ekrano momentiniame vaizde.

Kaip rodo aukščiau pateiktas vaizdas, nesvarbu, ar „Xlint“ visiškai nenurodytas, ar jis nurodytas aiškiai su „niekas“, rezultatas yra tas pats: dauguma įspėjimų nerodomi, tačiau yra paprastų nuorodų į nebenaudojamus ir nepatikrintus įspėjimus su rekomendacijomis Norėdami paleisti „javac“ su -Xlint: deprecation ir -Xlint: nepažymėta, jei reikia papildomos informacijos. „Javac“ paleidimas naudojant -Xlint: visi arba -Xlint be jokių kitų parinkčių parodys visus įspėjimus ir veiktų, jei norite pamatyti išsamią informaciją apie nebenaudojamus, nepažymėtus ir visus kitus taikomus „Xlint“ įspėjimus. Tai bus rodoma perėjus šaltinio kodą ir kiekvieną „Xlint“ įspėjimą atskirai.

-Xlint: aktoriai

Šią parinktį galima naudoti norint, kad kompiliatorius įspėtų kūrėją, kad atliekama nereikalinga komanda. Čia yra kodo fragmentas, kuris bus pažymėtas, jei sudarant šaltinį „javac“ buvo pateiktas -Xlint, -Xlint: all arba -Xlint: cast.

/ ** * Parodo -Xlint: įspėjimas dėl nereikalingo žaidėjų. * / private static void demonstrCastWarning () {final Set people = new HashSet (); zmones.prideti (fred); žmonės.pridėti (wilma); žmonės.add (barnis); for (galutinis Asmens asmuo: žmonės) {// Nereikalingas dalyvis, nes bendrinis tipas aiškiai yra Asmuo out.println ("Asmuo:" + ((Asmuo) asmuo) .getFullName ()); }} 

Ankstesniame kode nėra reikalo perkelti asmens objekto, esančio for kilpoje, į Asmenį ir -Xlint: „Cast“ įspės apie šį nereikalingą ir nereikalingą žaidimą pranešimu, kuriame bus nurodyta:

src \ dustin \ pavyzdžiai \ Main.java: 37: įspėjimas: [perduoti] nereikalingas vaidmuo į „dustin“ pavyzdžius.Person out.println ("Asmuo:" + ((Asmuo) asmuo) .getFullName ()); ^ 

-Xlint: nuvertėjimas

Kaip aptarta aukščiau, „Xlint“ įspėjimas apie nusidėvėjimą buvo akivaizdžiai laikomas pakankamai svarbiu, kad pateisintų jo reklamavimą, net jei „Xlint“ nėra aiškiai vykdomas. Šis įspėjimas įvyksta, kai naudojamas nebenaudojamas metodas. Šis pavyzdys rodo tokį atvejį.

/ ** * Priežastis -Xlint: atsisakymas spausdinti įspėjimą apie nebenaudojamo metodo naudojimą. * / private static void demonstrDeprecationWarning () {out.println ("Fredo vardas yra" + fred.getName ()); } 

Negalite pasakyti be „Person“ klasės šaltinio kodo (kurio pavyzdys yra „fred“), tačiau tas getName () metodas yra nebenaudojamas asmenyje. Šis „javac“ paleidimo rezultatas su -Xlint, -Xlint: all arba -Xlint: deprecation tai patvirtina (arba nurodo, jei kūrėjas praleido).

src \ dustin \ pavyzdžiai \ Main.java: 47: įspėjimas: [deprecation] getName () iš dustin.examples.Person buvo nebenaudojamas out.println („Fredo vardas visas“ + fred.getName ()); ^ 

-Xlint: divzero

Parinktis „divzero Xlint“ rodo, kai integralinis dalijimasis dalijasi iš pažodinio nulio. Kodo pavyzdys, kuris tai parodys, rodomas toliau:

/ ** * Parodykite -Xlint: divzero veikiant dalijant int iš pažodinio nulio. * / private static void demonstrDivideByZeroWarning () {out.println ("Du padalyti iš nulio yra" + divideIntegerByZeroForLongQuotient (2)); } / ** * Padalinkite pateiktą daliklį į pateiktą dividendą ir grąžinkite gautą * koeficientą. Netikrinama, ar daliklis nėra lygus nuliui. * * @param dividendas Skaičiuojamas skaičius. * @return Dividendų padalijimo iš pažodinio nulio koeficientas. * / private static long divideIntegerByZeroForLongQuotient (final int dividend) {// Sunkiai užkoduotas nulio daliklis perspės. Jei daliklis // būtų perduotas kaip parametras, kurio vertė lygi nuliui, tai to nepadarytų. grąžos dividendai / 0; } 

Dabar parodoma „javac“ išvestis, kai yra surašyta aukščiau.

src \ dustin \ pavyzdžiai \ Main.java: 231: perspėjimas: [divzero] padalijimas iš nulinės grąžos dividendų / 0; ^ 

Kai tyčia bandžiau priversti šį įspėjimą, atrodė, kad tai tinka tik užkoduotam (pažodžiui) nulio dalikliui. Be to, jis nepažymi dvigubo padalijimo, nes begalybė gali būti grąžinta kaip galiojantis atsakymas tokiu atveju be išimties.

-Xlint: tuščia

Tikslas -Xlint: tuščia yra pranešti kūrėjui, kad „tuščias“ jei sąlyginis yra kode. Mano bandymai rodo, kad tai taikoma tik tuščio „jei“ bloko atveju. „NetBeans“ pateikia „užuominas“ (tuos geltonus pabrauktus įspėjimus, kurie taip pat pažymėti dešiniojoje šaltinio kodo redaktoriaus paraštėje) kelių tipų tuštiems teiginiams, -Xlint: tuščia atrodo, kad pažymi tik tuščius teiginius „jei“. Aš įtraukiau kitus, kuriuos „NetBeans“ pažymi kartu su vienu -Xlint: tuščia vėliavos kitame šaltinio kodo pavyzdyje.

/ ** * Šis metodas parodo, kaip veikia „javac“ -Xlint: empty. Atminkite, kad „javac“ * -Xlint: empty pažymės tik tuščią sakinį, įtrauktą į „if“ bloką, * tačiau nepažymės tuščių sakinių, susijusių su „do-while“ kilpa, * while ciklu, for ciklu arba if -Kitas. „NetBeans“ tai pažymi, jei * įjungiami atitinkami „patarimai“. * / private static void demonstrEmptyWarning () {int [] sveikieji skaičiai = {1, 2, 3, 4, 5}; if (sveiki skaičiai.ilgis! = 5); out.println ("Ne penki?"); if (sveiki skaičiai.ilgis == 5) out.println ("Penki!"); Kitas; out.println („Ne penki!“); daryti; while (sveiki skaičiai.ilgis> 0); for (int sveikasis skaičius: sveiki skaičiai); out.println ("Rastas kitas sveikas skaičius!"); int skaitiklis = 0; o (skaitiklis <5); out.println ("Papildomi kabliataškiai.") ;;;; } 

Aukščiau pateiktas kodas yra užpildytas probleminiu kabliataškių išdėstymu, kurio kūrėjas beveik neabejoja. Šis kodas bus sukompiliuotas, tačiau kūrėjas įspėjamas apie šias įtartinas situacijas, jei -Xlint, -Xlint: viskasarba -Xlint: tuščia yra naudojamas su „javac“. Įspėjamieji pranešimai, atspausdinti kitaip sėkmingai sudarytame rinkinyje, rodomi toliau.

src \ dustin \ pavyzdžiai \ Main.java: 197: perspėjimas: [tuščias] tuščias sakinys po if jei (sveiki skaičiai.ilgis! = 5); ^ 

Pažymėta tik tuščia teiginio „jei“ sakinio sąlyga; apie kitus nepraneša -Xlint: tuščia.

-Xlint: prasiveržimas

Viliojantis, bet prieštaringai vertinamas „Java“ patogumas yra galimybė „permušti“ įprastas išraiškas a perjungti sakinį, kad ta pati logika būtų taikoma kelioms integralinėms reikšmėms su vienu kodo elementu. Jei visos vientisosios vertės su bendru funkcionalumu yra tuščios, išskyrus paskutinę, kuri faktiškai atlieka funkciją ir pateikia a pertrauka, -Xlint: prasiveržimas nebus aktyvuota. Tačiau jei kai kurie iš atveju išraiškos atlieka savo logiką, be bendros kritikos logikos, šis įspėjimas yra sukurtas. Toliau pateikiami tai demonstruojantys pavyzdžiai.

/ ** * Priežastis -Xlint: įspėjimas apie spausdintuvo įspėjimą apie jungiklio / dėklo naudojimą * kritimas. * / private static void demonstrateFallthroughWarning () {out.print („Wilmos mėgstamiausia spalva yra“); out.print (wilma.getFavoriteColor () + ", kuris yra"); // patikrinkite, ar „meninė“ pagrindinė spalva // PASTABA: tai nepadarys -Xlint: kritimas pažymėdamas įspėjimą // nes jokiame atvejo teiginyje nėra funkcionalumo //, kurie neturi savo pertrauka. jungiklis (wilma.getFavoriteColor ()) {case MĖLYNA: case YELLOW: case RED: out.print ("pagrindinė spalva meninėms pastangoms"); pertrauka; 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 ("NĖRA pagrindinė meninė spalva"); } out.print ("ir yra"); // patikrinkite, ar pagrindinė „priedų“ spalva // PASTABA: Šis jungiklis paskatins -Xlint: kritimą, skleidžiantį įspėjimą //, nes byloje yra tam tikra funkcija // išraiška, kuri neturi savo pertraukos sakinio . jungiklis (wilma.getFavoriteColor ()) {case MĖLYNA: case GREEN: out.println ("(nėra lengva būti žaliu!)"); atvejis RED: out.println ("pagrindinė spalva, padedanti siekti priedų".); pertrauka; 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 ("NĖRA pagrindinė priedo spalva."); }} 

Pirmiau pateiktame kodo pavyzdyje tyčia parodomi abu jungiklio / dėklo atvejai (skirti žodžiai), dėl kurių ir nebus rodomas įspėjamasis pranešimas -Xlint: prasiveržimas. Toliau rodoma išvestis su tik vienu įspėjimu.

src \ dustin \ pavyzdžiai \ Main.java: 95: įspėjimas: [kritimas] galimas kritimas į atvejį RED: ^ 

atveju kad pažymėta buvo RED atveju sekdamas ŽALIA atveju tai padarė tam tikrą savo logiką prieš pereinant prie RED logikos.

-Xlintas: pagaliau

Ne vienas asmuo perspėjo: „Negrįžk pagal galutinę sąlygą“. Tiesą sakant, „Java grįžta ne visada“ yra „Java“ gėdos salėje. „Java“ kūrėją galima įspėti apie šią nemalonią situaciją naudojant -Xlint, -Xlint: viskasarba -Xlintas: pagaliau. Toliau rodoma šaltinio kodo dalis, parodanti, kaip šis įspėjimas gali būti sugeneruotas.

/ ** * Parodykite -Xlint: pagaliau sugeneruojamas įspėjamasis pranešimas, kai {@code pagaliau} * blokas negali normaliai baigtis. * / private static void demonstrateFinallyWarning () {try {final double quotient = divideIntegersForDoubleQuotient (10, 0); out.println ("koeficientas yra" + koeficientas); } catch („RuntimeException uncheckedException“) {out.println ("Pagauk išimtį:" + nepažymėtaException.toString ()); }} / ** * Padalykite pateiktą daliklį į pateiktą dividendą ir grąžinkite gautą * koeficientą. Netikrinama, ar daliklis nėra lygus nuliui. * * @param dividendas Skirstomas sveikasis skaičius. * @param daliklis Sveikasis skaičius, pagal kurį dividendai bus padalyti. * @return Dividendo padalijimo iš daliklio koeficientas. * / privatus statinis dvigubas dalijimasIntegersForDoubleQuotient (galutinis int dividendas, galutinis int daliklis) {dvigubas daliklis = 0.0; pabandykite {if (daliklis == 0) {mesti naują „ArithmeticException“ („Padalyti iš nulio negalima: negalima atlikti„ + dividendas + “/“ + daliklis); } // Tai nebūtų sukėlę „Xlint: divzero“ įspėjimo, jei mes čia patektume // su pažodiniu nulio dalikliu, nes „Begalybė“ būtų paprasčiausiai // grąžinta, o ne numanomas „ArithmeticException“ metimas. koeficientas = (dvigubas) dividendas / daliklis; } pagaliau {grąžinimo koeficientas; }} 

Tai, kas išdėstyta, yra ydinga ir greičiausiai nėra tokia, kokios kūrėjas ketino. Toliau rodomas atitinkamas įspėjimas „javac“, kai įgalinamas „Xlint“.

src \ dustin \ pavyzdžiai \ Main.java: 159: įspėjimas: [pagaliau] galiausiai sąlyga negali būti užbaigta normaliai} ^ 

-Xlint: nepaiso