Programování

Možnosti javac's -Xlint

Kompilátor programovacího jazyka Java (javac) poskytovaný společností Oracle (a dříve společností Sun) má několik nestandardních možností, které jsou často užitečné. Jednou z nejužitečnějších je sada nestandardních možností, které vytisknou varování, ke kterým dojde během kompilace. Tato sada možností je předmětem tohoto příspěvku.

Sekce stránky javac na seznamech nestandardních možností a poskytuje stručné podrobnosti o každé z těchto možností. Následuje relevantní úryvek z této stránky.

Seznam těchto možností je k dispozici také z příkazového řádku (za předpokladu, že je nainstalována sada Java SDK) s příkazem: javac -help -X. To je stručnější než výše uvedená ukázka manuálové stránky / webové stránky a je zobrazena dále.

Jako předchozí snímek z běhu javac -help -X označuje, že deset konkrétních podmínek, pro které existují varování Xlint, je (v abecedním pořadí): obsazení, odpis, divzero, prázdný, propadnout, Konečně, přepíše, cesta, seriál, a nezaškrtnuto. Krátce se podívám na každý z nich a poskytnu fragment kódu, který vede k tomu, že se tato varování vyskytnou, když je Xlint zapnutý. Všimněte si, že manuálová stránka pro javac a Java jav 6 stránka javac obsahují pouze polovinu těchto možností Xlint (dokumentace zjevně není tak aktuální jako použití / pomoc javacu). Existuje užitečná položka NetBeans Wiki, která shrnuje všech deset možností.

Kompilátor javac umožňuje povolit všechna nebo žádná z varování Xlint. Pokud Xlint není zadán u všech možností -Xlint: none není výslovně zadán, chování nebude zobrazovat většinu upozornění. Zajímavé je, že výstup poskytuje varování o ukončení podpory a nekontrolovaných varováních a doporučuje spustit javac s povoleným -Xlint, abyste si mohli prohlédnout podrobnosti o těchto dvou typech varování.

Před koncem tohoto příspěvku předvedu kód Java, který vede k celkově 13 hlášeným varováním Xlint pokrývajícím všech deset výše diskutovaných možností. Bez zadání Xlint je však výstup zobrazen na následujícím snímku obrazovky.

Jak ukazuje výše uvedený obrázek, ať už Xlint není zadán vůbec, nebo je specifikován explicitně s „none“, výsledek je stejný: většina varování se nezobrazí, ale existují jednoduché odkazy na ukončení podpory a nekontrolovaná varování s doporučeními spustit javac s -Xlint: zastarávání a -Xlint: nezaškrtnuto pro další podrobnosti. Spuštění javacu s -Xlint: all nebo -Xlint bez dalších možností zobrazí všechna varování a bude pracovat na zobrazení podrobností týkajících se zastaralých, nezaškrtnutých a všech dalších příslušných varování s povoleným Xlintem. To se zobrazí po projití zdrojového kódu a každého varování Xlint zvlášť.

-Xlint: obsazení

Tuto možnost lze použít k tomu, aby kompilátor varoval vývojáře, že se provádí redundantní cast. Zde je fragment kódu, který by byl označen, pokud by byl při kompilaci zdroje poskytnut javac -Xlint, -Xlint: all nebo -Xlint: cast.

/ ** * Demonstruje -Xlint: varování obsazení nadbytečného obsazení. * / private static void proveďte ukázkuCastWarning () {final Set people = new HashSet (); people.add (fred); people.add (wilma); people.add (barney); for (final Person person: people) {// Redundantní cast, protože obecný typ je výslovně Person out.println ("Person:" + ((Person) person) .getFullName ()); }} 

Ve výše uvedeném kódu není nutné vrhat objekt person uvnitř smyčky for na Person a -Xlint: cast bude varovat před tímto zbytečným a nadbytečným obsazením se zprávou uvádějící něco jako:

src \ dustin \ examples \ Main.java: 37: varování: [obsazení] redundantní obsazení na dustin.examples.Person out.println ("Osoba:" + ((Osoba) osoba) .getFullName ()); ^ 

-Xlint: podpora

Jak již bylo uvedeno výše, varování před opuštěním Xlint bylo zjevně považováno za dostatečně důležité, aby ospravedlnilo jeho inzerci, i když Xlint není výslovně spuštěn. K tomuto varování dochází, když je vyvolána zastaralá metoda. Následující příklad kódu ukazuje takový případ.

/ ** * Příčina -Xlint: upozornění na zastaralost k tisku o použití zastaralé metody. * / private static void demonstrovatDeprecationWarning () {out.println ("Fredovo celé jméno je" + fred.getName ()); } 

Bez zdrojového kódu pro třídu Person (z čehož je „fred“ instance) nemůžete říct, ale tato metoda getName () je v Personě zastaralá. Následující výstup ze spuštění javacu s -Xlint, -Xlint: all nebo -Xlint: deprecation to potvrzuje (nebo upozorňuje na to, pokud to vývojáři zmeškali).

src \ dustin \ examples \ Main.java: 47: varování: [zastaralé] getName () v dustin.examples.Person bylo zastaralé out.println ("Fredovo celé jméno je" + fred.getName ()); ^ 

-Xlint: divzero

Možnost divzero Xlint označuje, kdy se integrální dělení dělí doslovnou nulou. Příklad kódu, který to předvede, je uveden dále:

/ ** * Demonstrovat -Xlint: divzero v akci vydělením int doslovnou nulou. * / private static void demonstrovatDivideByZeroWarning () {out.println ("Dva děleni nulou jsou" + divideIntegerByZeroForLongQuotient (2)); } / ** * Rozdělte poskytnutý dělitel na poskytnutou dividendu a vraťte * výsledný kvocient. Neprovádějí se žádné kontroly, aby se zajistilo, že dělitel není nula. * * @param dividenda Celé číslo k rozdělení. * @return Kvocient rozdělení dividendy doslovnou nulou. * / private static long divideIntegerByZeroForLongQuotient (final int dividend) {// Pevně ​​dělený nulový dělitel povede k varování. Pokud by byl dělitel // předán jako parametr s nulovou hodnotou, nevedlo by to k // tomuto varování. výnosová dividenda / 0; } 

Nyní se zobrazí výstup z javacu při kompilaci výše uvedeného.

src \ dustin \ examples \ Main.java: 231: varování: [divzero] dělení nulovou návratovou dividendou / 0; ^ 

Když jsem se záměrně pokusil vynutit toto varování, zdálo se, že funguje pouze pro pevně zakódovaný (doslovný) nulový dělitel. Také neoznačuje dvojité dělení, protože Infinity lze v takovém případě vrátit jako platnou odpověď bez vyvolání výjimky.

-Xlint: prázdný

Účel -Xlint: prázdný je upozornit vývojáře, že „prázdný“ -li podmíněné je v kódu. Z mých testů se zdá, že to platí pouze pro případ prázdného bloku „if“. NetBeans poskytuje „rady“ (žlutá podtržená varování, která jsou označena také na pravém okraji editoru zdrojového kódu) pro několik typů prázdných příkazů, ale -Xlint: prázdný Zdá se, že označuje pouze prázdné příkazy „if“. Spolu s tím jsem zahrnul i ostatní, které NetBeans označí -Xlint: prázdný příznaky v dalším ukázce zdrojového kódu.

/ ** * Tato metoda ukazuje, jak funguje javac's -Xlint: empty. Všimněte si, že * -Xlint: empty javacu označí pouze prázdný příkaz obsažený v bloku „if“, * ale neoznačí prázdné příkazy spojené se smyčkou do-while, * smyčkou while, smyčkou for nebo if -jiný. NetBeans je označí, pokud jsou zapnuty * příslušné „Rady“. * / private static void demonstrovatEmptyWarning () {int [] celá čísla = {1, 2, 3, 4, 5}; if (integers.length! = 5); out.println ("Ne pět?"); if (integers.length == 5) out.println ("Five!"); jiný; out.println („Ne pět!“); dělat; while (integers.length> 0); pro (celé číslo: celá čísla); out.println ("Bylo nalezeno další celé číslo!"); int counter = 0; while (počitadlo <5); out.println ("Extra středníky.") ;;;; } 

Výše uvedený kód je naplněn problematickým umístěním středníků, které téměř jistě nejsou tím, co vývojář chtěl. Tento kód se zkompiluje, ale vývojář je na tyto podezřelé situace upozorněn, pokud -Xlint, -Xlint: všenebo -Xlint: prázdný se používá s javac. Varovné zprávy, které jsou vytištěny v jinak úspěšné kompilaci, jsou zobrazeny dále.

src \ dustin \ examples \ Main.java: 197: varování: [prázdný] prázdný příkaz po if if (integers.length! = 5); ^ 

Označena je pouze prázdná klauzule "if"; ostatní nehlásí -Xlint: prázdný.

-Xlint: průlom

Lákavou, ale kontroverzní výhodou, kterou Java poskytuje, je schopnost „prolomit“ běžné výrazy v a přepínač příkaz pro použití stejné logiky na více integrálních hodnot s jednou částí kódu. Pokud jsou všechny integrální hodnoty se sdílenou funkcí prázdné, s výjimkou konečné, která skutečně provádí funkci a poskytuje a přestávka-Xlint: průlom nebude aktivován. Pokud však některé z případ výrazy provádějí svou vlastní logiku kromě běžné logiky propadu, toto varování se vytvoří. Níže je uveden příklad, který to ukazuje.

/ ** * Příčina -Xlint: propad k tisku varování o použití přepínače / případu * propad. * / private static void demonstrovatFallthroughWarning () {out.print ("Wilmina oblíbená barva je"); out.print (wilma.getFavoriteColor () + ", což je"); // zkontrolujte, zda je „umělecká“ primární barva // POZNÁMKA: Tato nebude mít za následek -Xlint: fallthrough nahlášení varování //, protože v žádném z příkazů case nejsou zahrnuty žádné funkce //, které nemají vlastní přestávka. switch (wilma.getFavoriteColor ()) {případ MODRÝ: ​​případ ŽLUTÝ: případ ČERVENÝ: out.print ("primární barva pro umělecké úsilí"); přestávka; pouzdro ČERNÉ: pouzdro HNĚDÉ: pouzdro CORAL: pouzdro EGGSHELL: pouzdro ZELENÉ: pouzdro MAUVE: pouzdro ORANŽOVÉ: pouzdro PINK: pouzdro Fialové: pouzdro TAN: pouzdro BÍLÉ: výchozí: out.print ("NENÍ primární uměleckou barvou"); } out.print ("a je"); // zkontrolujte, zda je „aditivní“ primární barva // POZNÁMKA: Tento přepínač povede k -Xlint: fallthrough emitující varování //, protože v případě je prováděna nějaká funkce // výraz, který nemá vlastní příkaz break . switch (wilma.getFavoriteColor ()) {případ MODRÝ: ​​případ ZELENÝ: out.println ("(není snadné být zelený!)"); case RED: out.println ("primární barva pro snahy o aditiva."); přestávka; pouzdro ČERNÉ: pouzdro BROWN: pouzdro CORAL: pouzdro EGGSHELL: pouzdro MAUVE: pouzdro ORANGE: pouzdro PINK: pouzdro PURPLE: pouzdro TAN: pouzdro ŽLUTÉ: pouzdro BÍLÉ: výchozí: out.println ("NENÍ primární aditivní barva."); }} 

Výše uvedený příklad kódu záměrně ukazuje oba případy (zamýšlené slovní hříčky) přepínače / případu, které budou a nebudou vést k varovné zprávě díky -Xlint: průlom. Dále se zobrazí výstup s jediným upozorněním.

src \ dustin \ examples \ Main.java: 95: varování: [propad] možný propad do případu RED: ^ 

The případ označená byla ČERVENÁ případ po ZELENÉ případ to udělalo nějakou vlastní logiku, než propadlo RED logice.

-Xlint: konečně

Více než jedna osoba varovala: „Nevracejte se v závěrečné klauzuli.“ Ve skutečnosti je „návrat Javy ne vždy“ v Síni hanby Javy. Vývojáře Java lze na tuto hanebnou situaci upozornit pomocí -Xlint, -Xlint: všenebo -Xlint: konečně. Dále se zobrazí část zdrojového kódu, která ukazuje, jak lze toto varování vygenerovat.

/ ** * Demonstrace -Xlint: konečně generování varovné zprávy, když blok {@code konečne} * nemůže normálně skončit. * / private static void demonstrovatFinallyWarning () {try {final double quotient = divideIntegersForDoubleQuotient (10, 0); out.println ("Kvocient je" + kvocient); } catch (RuntimeException unfeckedException) {out.println ("Zachytila ​​výjimku:" + nezaškrtnutáException.toString ()); }} / ** * Rozdělte poskytnutý dělitel na poskytnutou dividendu a vraťte * výsledný kvocient. Neprovádějí se žádné kontroly, aby se zajistilo, že dělitel není nula. * * @param dividenda Celé číslo k rozdělení. * @param divisor Celé číslo, kterým se dividenda vydělí. * @return Kvocient rozdělení dividendy dělitelem. * / 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 enabled: cannot perform" + dividend + "/" + divisor); } // To by nevedlo k varování Xlint: divzero, kdybychom se sem dostali // s doslovným nulovým dělitelem, protože Infinity by byl jednoduše // vrácen místo implicitního házení ArithmeticException. kvocient = (dvojitá) dividenda / dělitel; } nakonec {návratový kvocient; }} 

Výše uvedené je chybné a pravděpodobně to není to, co vývojář zamýšlel. Příslušný varovný javac poskytuje, když je povolen Xlint, je zobrazen dále.

src \ dustin \ examples \ Main.java: 159: varování: [konečně] klauzule konečně nemůže být dokončena normálně} ^ 

-Xlint: přepíše

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