Programovanie

Možnosti javac's -Xlint

Kompilátor programovacieho jazyka Java (javac) poskytovaný spoločnosťou Oracle (a predtým spoločnosťou Sun) má niekoľko neštandardných možností, ktoré sú často užitočné. Jednou z najužitočnejších je sada neštandardných možností, ktoré tlačia varovania, ktoré sa vyskytnú počas kompilácie. Táto skupina možností je predmetom tohto príspevku.

Sekcia stránok javac o neštandardných zoznamoch možností a poskytuje stručné podrobnosti o každej z týchto možností. Nasleduje relevantný úryvok z tejto stránky.

Zoznam týchto možností je k dispozícii aj z príkazového riadku (za predpokladu, že je nainštalovaná sada Java SDK) s príkazom: javac -help -X. Toto je stručnejšie ako vyššie uvedená ukážka manuálovej stránky / webovej stránky, ktorá sa zobrazuje ďalej.

Ako predchádzajúca snímka z chodu javac -help -X označuje, že desať konkrétnych podmienok, pre ktoré existujú varovania Xlint, je (v abecednom poradí): obsadenie, odpis, divzero, prázdny, prepadnúť, konečne, prepíše, cesta, sériovýa nezačiarknuté. Krátko sa pozriem na každú z nich a poskytnem útržok kódu, ktorý vedie k týmto varovaniam, ku ktorým dôjde pri zapnutí Xlintu. Upozorňujeme, že manuálna stránka pre javac a stránka Java SE 6 javac obsahujú iba polovicu týchto možností Xlint (dokumentácia zjavne nie je taká aktuálna ako použitie / pomoc javacu). Existuje užitočný záznam NetBeans Wiki, ktorý sumarizuje všetkých desať možností.

Kompilátor javac umožňuje povoliť všetky alebo žiadne z varovaní Xlint. Ak Xlint nie je zadaný vôbec pri voľbe -Xlint: none nie je výslovne zadaný, správanie nebude zobrazovať väčšinu varovaní. Je zaujímavé, že výstup poskytuje varovanie pred ukončením podpory a nezaškrtnutými varovaniami a odporúča spustiť javac s povoleným -Xlint, aby ste si mohli pozrieť podrobnosti o týchto dvoch typoch varovaní.

Pred koncom tohto príspevku ukážem kód Java, ktorý vedie k celkovým 13 hláseným varovaniam Xlint pokrývajúcim všetkých desať možností diskutovaných vyššie. Bez zadania Xlintu je však výstup taký, ako je znázornené na nasledujúcej snímke obrazovky.

Ako ukazuje vyššie uvedený obrázok, bez ohľadu na to, či je Xlint zadaný vôbec alebo je výslovne uvedený ako „žiadny“, výsledok je rovnaký: väčšina upozornení sa nezobrazí, existujú však jednoduché odkazy na ukončenie podpory a nekontrolované upozornenia s odporúčaniami spustiť javac s -Xlint: podpora a -Xlint: nezačiarknuté pre ďalšie podrobnosti. Spustenie javacu s parametrom -Xlint: all alebo -Xlint bez ďalších možností zobrazí všetky varovania a bude sa snažiť zobraziť podrobnosti týkajúce sa zastaraných, nezaškrtnutých a všetkých ďalších príslušných varovaní s povoleným Xlintom. Toto sa zobrazí po prechode zdrojového kódu a každého varovania Xlint osobitne.

-Xlint: obsadenie

Túto možnosť je možné použiť na to, aby kompilátor varoval vývojára, že sa vytvára redundantné obsadenie. Tu je útržok kódu, ktorý by bol označený, ak by bol pri kompilácii zdroja poskytnutý javac -Xlint, -Xlint: all alebo -Xlint: cast.

/ ** * Ukazuje -Xlint: varovanie pred redundantným obsadením. * / private static void manifestaCastWarning () {final Set people = new HashSet (); people.add (fred); people.add (wilma); ľudia.pridat (barney); for (final Person person: people) {// Redundant cast because generic type explicitly is Person out.println ("Person:" + ((Person) person) .getFullName ()); }} 

Vo vyššie uvedenom kóde nie je potrebné vrhať objekt person vo vnútri cyklu for na Person a -Xlint: cast bude na toto zbytočné a nadbytočné obsadenie varovať správou, ktorá bude obsahovať napríklad:

src \ dustin \ examples \ Main.java: 37: varovanie: [obsadenie] redundantné obsadenie do dustin.examples.Person out.println ("Osoba:" + ((Osoba) osoba) .getFullName ()); ^ 

-Xlint: ukončenie podpory

Ako už bolo uvedené vyššie, varovanie pred zneužitím Xlint sa zjavne považovalo za dostatočne dôležité na to, aby bolo možné ho inzerovať, aj keď Xlint nie je výslovne spustený. Toto varovanie sa objaví, keď je vyvolaná zastaraná metóda. Nasledujúci príklad kódu demonštruje takýto prípad.

/ ** * Príčina -Xlint: ukončenie podpory pri tlači, varovanie o použití zastaranej metódy. * / private static void demonstrovatDeprecationWarning () {out.println ("Celé meno Freda je" + fred.getName ()); } 

Bez zdrojového kódu pre triedu Person (z čoho je „fred“ inštancia) to nemôžete zistiť, ale metóda getName () je v Persone zastaraná. Nasledujúci výstup zo spustenia javacu s -Xlint, -Xlint: all alebo -Xlint: deprecation to potvrdzuje (alebo upozorňuje na to, ak to vývojárovi uniklo).

src \ dustin \ examples \ Main.java: 47: varovanie: [zastarávanie] getName () v dustin.examples.Person bol zastaraný out.println ("Celé meno Freda je" + fred.getName ()); ^ 

-Xlint: divzero

Voľba divzero Xlint označuje, kedy sa integrálne delenie delí doslova nulou. Nasleduje príklad kódu, ktorý to demonštruje:

/ ** * Ukážka -Xlint: divzero v akcii vydelením int doslovnou nulou. * / private static void demonstrovatDivideByZeroWarning () {out.println ("Dve delené nulou sú" + divideIntegerByZeroForLongQuotient (2)); } / ** * Rozdelte poskytnutý deliteľ na poskytnutú dividendu a vráťte * výsledný kvocient. Nerobia sa žiadne kontroly, aby sa zistilo, či deliteľ nie je nula. * * @param dividenda Celé číslo, ktoré sa má rozdeliť. * @return Kvocient delenia dividendy doslovnou nulou. * / private static long divideIntegerByZeroForLongQuotient (final int dividend) {// Pevne rozdelený nulový delič povedie k varovaniu. Keby bol deliteľ // odovzdaný ako parameter s nulovou hodnotou, neviedlo by to k // tomuto varovaniu. návratná dividenda / 0; } 

Teraz sa zobrazí výstup z javacu po kompilácii vyššie uvedeného.

src \ dustin \ examples \ Main.java: 231: varovanie: [divzero] delenie nulovou dividendou / 0; ^ 

Keď som sa zámerne pokúsil vynútiť toto varovanie, zdalo sa, že funguje iba pre pevne zakódovaný (doslovný) nulový deliteľ. Taktiež neoznačuje dvojité delenie, pretože nekonečno je v takom prípade možné vrátiť ako platnú odpoveď bez toho, aby došlo k výnimke.

-Xlint: prázdny

Účel -Xlint: prázdny je upozorniť vývojára, že „prázdny“ ak podmienené je v kóde. Z mojich testov sa zdá, že to platí iba pre prípad prázdneho bloku „keby“. NetBeans poskytuje „rady“ (tie žlté podčiarknuté varovania, ktoré sú označené aj na pravom okraji editora zdrojového kódu) pre niekoľko typov prázdnych príkazov, ale -Xlint: prázdny Zdá sa, že označuje iba prázdne vyhlásenia „ak“. Spolu s tým som zahrnul ďalšie, ktoré označuje NetBeans -Xlint: prázdny príznaky v nasledujúcej ukážke zdrojového kódu.

/ ** * Táto metóda ukazuje, ako funguje javac's -Xlint: empty. Upozorňujeme, že javac * -Xlint: empty nahlási iba prázdny príkaz zapojený do bloku „if“, * ale neoznačí prázdne príkazy spojené so slučkou do-while, * while, smyčka for alebo if - inak. NetBeans ich označuje, ak sú zapnuté * príslušné „rady“. * / private static void demonstrovatEmptyWarning () {int [] cele cisla = {1, 2, 3, 4, 5}; if (integers.length! = 5); out.println ("Nie päť?"); if (integers.length == 5) out.println ("Päť!"); inak; out.println („Nie päť!“); robiť; while (cele cisla.lenka> 0); pre (celé číslo: celé čísla); out.println ("Bolo nájdené ďalšie celé číslo!"); int counter = 0; while (počítadlo <5); out.println („Extra bodkočiarky.“) ;;;; } 

Vyššie uvedený kód je naplnený problematickým umiestňovaním bodkočiarok, ktoré vývojár takmer určite nie je tým, čo chcel. Tento kód sa skompiluje, ale vývojár je varovaný pred týmito podozrivými situáciami, ak -Xlint, -Xlint: všetkyalebo -Xlint: prázdny sa používa s javac. Ďalej sa zobrazia varovné správy, ktoré sa vytlačia v inak úspešnej kompilácii.

src \ dustin \ examples \ Main.java: 197: varovanie: [prázdny] prázdny príkaz po if if (integers.length! = 5); ^ 

Iba prázdna doložka vyhlásenia „ak“ je označená; ostatné nenahlasuje -Xlint: prázdny.

-Xlint: prielom

Lákavou, ale kontroverznou vymoženosťou, ktorú Java poskytuje, je schopnosť „prebiť“ bežné výrazy v a prepínač príkaz na použitie rovnakej logiky na viac integrálnych hodnôt s jedným kódom. Ak sú všetky integrálne hodnoty so zdieľanou funkčnosťou prázdne, okrem konečnej, ktorá skutočne vykonáva funkčnosť a poskytuje a prestávka, -Xlint: prielom nebude aktivovaný. Ak však niektoré z prípade výrazy skutočne vykonávajú svoju vlastnú logiku, okrem bežnej logiky prepadu, sa vytvorí toto varovanie. Ďalej sú uvedené príklady, ktoré to dokazujú.

/ ** * Príčina -Xlint: prepad tlače s varovaním o použití prepínača / prípadu * prepad. * / private static void demonstraceFallthroughWarning () {out.print ("Wilma má obľúbenú farbu"); out.print (wilma.getFavoriteColor () + ", čo je"); // skontrolujte, či je „umelecká“ primárna farba // POZNÁMKA: Toto nebude viesť k -Xlint: prelomeniu označenia varovania //, pretože v žiadnom z príkazov prípadu nie je zahrnutá žiadna funkčnosť //, ktoré nemajú svoje vlastné prestávka. switch (wilma.getFavoriteColor ()) {case BLUE: case YELLOW: case RED: out.print ("primárna farba pre umelecké snaženie"); prestávka; puzdro ČIERNE: puzdro HNEDÉ: puzdro CORAL: puzdro EGGSHELL: puzdro ZELENÉ: puzdro MAUVE: puzdro ORANŽOVÉ: puzdro RUŽOVÉ: puzdro Fialové: puzdro TAN: puzdro BIELE: predvolené: out.print („NIE primárna umelecká farba“); } out.print ("a je"); // skontrolujte, či je „doplnková“ primárna farba // POZNÁMKA: Tento prepínač BUDE viesť k -Xlint: fallthrough vydávajúcemu varovanie //, pretože v prípade sú vykonávané niektoré funkcie // výraz, ktorý nemá vlastný príkaz break . switch (wilma.getFavoriteColor ()) {case BLUE: case GREEN: out.println ("(nie je ľahké byť zelený!)"); prípad ČERVENÝ: out.println ("primárna farba pre aditívne úsilie."); prestávka; puzdro ČIERNE: puzdro HNEDÉ: puzdro CORAL: puzdro EGGSHELL: puzdro MAUVE: puzdro ORANGE: puzdro PINK: puzdro FIALOVÉ: puzdro TAN: puzdro ŽLTÉ: puzdro BÍLÉ: predvolené: out.println ("NIE je to primárna aditívna farba."); }} 

Vyššie uvedený príklad kódu zámerne zobrazuje oba prípady (určené slovnou hračkou) spínača / prípadu, ktoré povedú a nebudú viesť k varovnej správe vďaka -Xlint: prielom. Nasleduje výstup s iba jedným varovaním.

src \ dustin \ examples \ Main.java: 95: varovanie: [prepad] možný prepad do prípadu RED: ^ 

The prípade označená bola ČERVENÁ prípade po ZELENEJ prípade to urobilo svoju vlastnú logiku predtým, ako prešlo k RED logike.

-Xlint: konečne

Viac ako jedna osoba varovala: „Nevracajte sa v záverečnej klauzule.“ „Návrat Javy sa v skutočnosti nie vždy“ nachádza v Sieni hanby Java. Vývojára Java je možné na túto nepriaznivú situáciu upozorniť použitím -Xlint, -Xlint: všetkyalebo -Xlint: konečne. Ďalej je zobrazený kúsok zdrojového kódu demonštrujúci, ako je možné vygenerovať toto varovanie.

/ ** * Demonštrovať -Xlint: konečne vygeneruje varovnú správu, keď blok {@code konečne} * nemôže skončiť normálne. * / private static void proveďteFinallyWarning () {try {final double quotient = divideIntegersForDoubleQuotient (10, 0); out.println ("Kvocient je" + kvocient); } catch (RuntimeException nezaškrtnutéException) {out.println ("Zachytila ​​výnimku:" + nezaškrtnutéException.toString ()); }} / ** * Rozdelte poskytnutý deliteľ na poskytnutú dividendu a vráťte * výsledný kvocient. Nevykonávajú sa žiadne kontroly, aby sa zabezpečilo, že deliteľ nie je nula. * * @param dividenda Celé číslo, ktoré sa má rozdeliť. * @param divisor Celé číslo, o ktoré sa dividenda rozdelí. * @return Kvocient delenia dividendy deliteľom. * / private static double divideIntegersForDoubleQuotient (final int dividend, final int divisor) {dvojitý kvocient = 0,0; try {if (divisor == 0) {throw new ArithmeticException ("Division by zero not allowed: cannot perform" + dividend + "/" + divisor); } // To by neviedlo k varovaniu Xlint: divzero, keby sme sa sem dostali // s doslovným nulovým deliteľom, pretože by sa nekonečno jednoducho // vrátilo namiesto implicitného hádzania ArithmeticException. kvocient = (dvojitá) dividenda / deliteľ; } konečne {návratový kvocient; }} 

Vyššie uvedené je chybné a pravdepodobne to nie je to, čo vývojár zamýšľal. Relevantný varovný javac poskytuje, keď je povolený Xlint, je zobrazený ďalej.

src \ dustin \ examples \ Main.java: 159: varovanie: [konečne] klauzula konečne nemôže byť dokončená normálne} ^ 

-Xlint: prepíše

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