Programmering

javacs -Xlint-indstillinger

Java-programmeringssprog-kompilatoren (javac) leveret af Oracle (og tidligere af Sun) har flere ikke-standardindstillinger, der ofte er nyttige. En af de mest nyttige er det sæt ikke-standardindstillinger, der udskriver advarsler, der opstår under kompilering. Dette sæt valgmuligheder er genstand for dette indlæg.

Sektionen med javac-sider på ikke-standardindstillingslister og giver korte detaljer om hver af disse indstillinger. Følgende er det relevante uddrag fra denne side.

En liste over disse indstillinger er også tilgængelig fra kommandolinjen (forudsat at Java SDK er installeret) med kommandoen: javac -help -X. Dette er kortere end mandsiden / websideksemplet vist ovenfor og vises derefter.

Som det forrige øjebliksbillede fra at køre javac -hjælp -X angiver, at de ti specifikke betingelser, for hvilke der findes Xlint-advarsler, er (i alfabetisk rækkefølge): støbt, forældelse, divzero, tom, falder gennem, langt om længe, tilsidesætter, sti, serielog ikke markeret. Jeg ser kort på hver af disse og giver et kodestykke, der fører til, at denne advarsel opstår, når Xlint er tændt. Bemærk, at mandsiden til javac og Java SE 6 javac-siden begge kun viser halvdelen af ​​disse Xlint-indstillinger (dokumentation er tilsyneladende ikke så opdateret som javac-brug / hjælp). Der er en nyttig NetBeans Wiki-post, der opsummerer alle ti muligheder.

Javac-kompilatoren tillader, at alle eller ingen af ​​Xlint-advarslerne aktiveres. Hvis Xlint overhovedet ikke er angivet for indstillingen -Xlint: ingen er eksplicit angivet, er adfærden ikke at vise de fleste advarsler. Interessant nok giver outputen en advarsel om afskrivning og ukontrollerede advarsler og anbefaler, at du kører javac med -Xlint aktiveret for at se detaljerne om disse to typer advarsler.

Før slutningen af ​​dette indlæg demonstrerer jeg Java-kode, der fører til 13 rapporterede Xlint-advarsler i alt, der dækker alle ti af de muligheder, der er diskuteret ovenfor. Uden Xlint er det dog angivet, at output er som vist i næste skærmbillede.

Som ovenstående billede indikerer, om Xlint overhovedet ikke er specificeret eller specifikt er specificeret med "ingen", er resultatet det samme: størstedelen af ​​advarslerne vises ikke, men der er enkle henvisninger til afskrivningen og ukontrollerede advarsler med anbefalinger at køre javac med henholdsvis -Xlint: udfasning og -Xlint: ikke markeret for yderligere detaljer. Kørsel af javac med -Xlint: alle eller -Xlint uden andre valgmuligheder viser alle advarsler og vil arbejde for at se detaljerne om forældede, ukontrollerede og alle andre gældende Xlint-aktiverede advarsler. Dette vises efter at have gennemgået kildekoden og hver Xlint-advarsel individuelt.

-Xlint: rollebesætning

Denne mulighed kan bruges til at få compileren til at advare udvikleren om, at der laves en overflødig rollebesætning. Her er et kodestykke, der bliver markeret, hvis -Xlint, -Xlint: all eller -Xlint: cast blev leveret til javac, når kilden kompileres.

/ ** * Demonstrerer -Xlint: cast advarsel om en overflødig rollebesætning. * / privat statisk ugyldighed demonstrereCastWarning () {final Set people = new HashSet (); people.add (fred); people.add (wilma); people.add (barney); for (endelig personperson: mennesker) {// Redundant rollebesætning, fordi generisk type udtrykkeligt er Person out.println ("Person:" + ((Person) person) .getFullName ()); }} 

I ovenstående kode er der ikke behov for at kaste personobjektet inde i for-sløjfen til Person og -Xlint: cast vil advare om denne unødvendige og overflødige rollebesætning med en besked om noget som:

src \ dustin \ eksempler \ Main.java: 37: advarsel: [cast] redundant cast to dustin.examples.Person out.println ("Person:" + ((Person) person) .getFullName ()); ^ 

-Xlint: forældelse

Som diskuteret ovenfor blev Xlint-afskrivningsadvarslen åbenbart anset for vigtig nok til at retfærdiggøre, at den blev annonceret, selv når Xlint ikke eksplicit køres. Denne advarsel opstår, når en afviklet metode påberåbes. Følgende kodeeksempel demonstrerer en sådan sag.

/ ** * Årsag -Xlint: forældelse for at udskrive advarsel om brug af afviklet metode. * / privat statisk ugyldigt demonstrereDeprecationWarning () {out.println ("Freds fulde navn er" + fred.getName ()); } 

Du kan ikke fortælle uden kildekoden til Person-klassen (hvoraf "fred" er en forekomst), men denne getName () -metoden er udfaset i Person. Følgende output fra at køre javac med -Xlint, -Xlint: all eller -Xlint: udfasning bekræfter det (eller påpeger det, hvis udvikleren savnede det).

src \ dustin \ eksempler \ Main.java: 47: advarsel: [deprecation] getName () i dustin.examples.Person er udfaset out.println ("Freds fulde navn er" + fred.getName ()); ^ 

-Xlint: divzero

Divzero Xlint-indstillingen angiver, hvornår integreret division divideres med et bogstaveligt nul. Et kodeeksempel, der viser dette, vises derefter:

/ ** * Demonstrer -Xlint: divzero i aktion ved at dividere et int med et bogstaveligt nul. * / privat statisk ugyldigt demonstrereDivideByZeroWarning () {out.println ("To divideret med nul er" + divideIntegerByZeroForLongQuotient (2)); } / ** * Del den tildelte skillevæg i det angivne udbytte, og returner den * resulterende kvotient. Der foretages ingen kontrol for at sikre, at skillelinjen ikke er nul. * * @param udbytte Heltal, der skal opdeles. * @return Kvotient for opdeling af udbytte med bogstaveligt nul. * / private static long divideIntegerByZeroForLongQuotient (final int dividend) {// Hårdkodet divisor på nul vil føre til advarsel. Hvis divisoren var // sendt ind som en parameter med en nulværdi, ville dette ikke føre til // denne advarsel. returudbytte / 0; } 

Outputtet fra javac, når ovenstående er kompileret, vises nu.

src \ dustin \ eksempler \ Main.java: 231: advarsel: [divzero] division med nul returudbytte / 0; ^ 

Da jeg forsætligt forsøgte at tvinge denne advarsel, syntes det kun at virke for en hårdkodet (bogstavelig) nuldeler. Det markerer heller ikke dobbelt division, fordi Infinity kan returneres som et gyldigt svar i så fald uden at kaste en undtagelse.

-Xlint: tom

Formålet med -Xlint: tom er at underrette udvikleren om, at en "tom" hvis betinget er i koden. Fra mine tests synes dette kun at gælde for tilfældet med den tomme "hvis" -blok. NetBeans giver "tip" (de gule understregede advarsler, der også er markeret i højre margen i kildekodeditoren) til flere typer tomme udsagn, men -Xlint: tom synes kun at markere de tomme "hvis" udsagn. Jeg inkluderede de andre, som NetBeans markerer sammen med den ene -Xlint: tom flag i den næste kildekodeeksempel.

/ ** * Denne metode viser, hvordan javacs -Xlint: tom fungerer. Bemærk, at javacs * -Xlint: tom kun markerer den tomme sætning, der er involveret i "hvis" -blokken, * men ikke markerer de tomme udsagn, der er knyttet til do-while-sløjfen, * while-sløjfen, for-loop eller if -andet. NetBeans markerer disse, hvis * de relevante "tip" er slået til. * / privat statisk tomrum demonstrereEmptyWarning () {int [] heltal = {1, 2, 3, 4, 5}; hvis (heltal.længde! = 5); out.println ("Ikke fem?"); hvis (heltal.længde == 5) out.println ("Fem!"); andet; out.println ("Ikke fem!"); gøre; mens (heltal.længde> 0); for (int heltal: heltal); out.println ("Et andet heltal fundet!"); int tæller = 0; mens (tæller <5); out.println ("Ekstra semikolon.") ;;;; } 

Koden ovenfor er fyldt med problematisk placering af semikoloner, der næsten helt sikkert ikke er, hvad udvikleren ønskede. Denne kode kompileres, men udvikleren advares om disse mistænkelige situationer, hvis -Xlint, -Xlint: alt, eller -Xlint: tom bruges sammen med javac. Advarselsmeddelelserne, der udskrives i den ellers vellykkede kompilering, vises derefter.

src \ dustin \ eksempler \ Main.java: 197: advarsel: [tom] tom sætning efter if if (heltal.længde! = 5); ^ 

Kun den tomme "hvis" udsagnsklausul er markeret; de andre rapporteres ikke af -Xlint: tom.

-Xlint: gennembrud

En fristende, men kontroversiel bekvemmelighed, som Java giver, er evnen til at "gennemgå" almindelige udtryk i en kontakt erklæring for at anvende den samme logik på flere integrerede værdier med et stykke kode. Hvis alle de integrerede værdier med den delte funktionalitet er tomme bortset fra den endelige, der faktisk udfører funktionaliteten og giver en pause, det -Xlint: gennembrud aktiveres ikke. Men hvis nogle af de sag udtryk udfører deres egen logik ud over den fælles gennembrudslogik, denne advarsel er produceret. Et eksempel, der demonstrerer dette, vises derefter.

/ ** * Årsag -Xlint: gennembrud for at udskrive advarsel om brug af afbryder / sag * gennemslag. * / private static void demonstrFallthroughWarning () {out.print ("Wilmas yndlingsfarve er"); out.print (wilma.getFavoriteColor () + ", som er"); // tjek for at se om 'kunstnerisk' primærfarve // ​​BEMÆRK: Denne fører ikke til -Xlint: gennemfald markerer en advarsel // fordi ingen funktionalitet er inkluderet i nogen af ​​sagserklæringerne // der ikke har deres egen pause. switch (wilma.getFavoriteColor ()) {case BLUE: case GUL: case RED: out.print ("en primær farve til kunstneriske bestræbelser"); pause; sag BLACK: sag BRUN: sag CORAL: sag EGGSHELL: sag GRØN: sag MAUVE: sag ORANGE: sag PINK: sag Lilla: sag TAN: sag HVID: standard: out.print ("IKKE en primær kunstnerisk farve"); } out.print ("og er"); // tjek for at se om 'additiv' primærfarve // ​​BEMÆRK: Denne switch VIL føre til -Xlint: gennembrud udsender en advarsel // fordi der udføres en eller anden funktionalitet i en sag // udtryk, der ikke har sin egen pauseopgørelse . switch (wilma.getFavoriteColor ()) {case BLUE: case GREEN: out.println ("(det er ikke let at være grøn!)"); case RED: out.println ("en primær farve til additiv bestræbelser."); pause; sag BLACK: sag BROWN: sag CORAL: sag EGGSHELL: sag MAUVE: sag ORANGE: sag PINK: sag Lilla: sag TAN: sag GUL: sag HVID: standard: out.println ("IKKE en primær additiv farve."); }} 

Ovenstående kodeeksempel viser med vilje begge sager (ordspil beregnet) til kontakten / sagen, der vil og ikke vil føre til en advarselsmeddelelse takket være -Xlint: gennembrud. Outputtet, med kun en advarsel, vises derefter.

src \ dustin \ eksempler \ Main.java: 95: advarsel: [gennembrud] mulig gennemslag i sag RED: ^ 

Det sag der blev markeret var den RØDE sag efter det GRØNNE sag der gjorde noget af sin egen logik, før de faldt igennem til den RØDE logik.

-Xlint: endelig

Mere end en person har advaret: "Kom ikke tilbage i en endelig klausul." Faktisk er "Java's return ikke altid" i Java Hall of Shame. En Java-udvikler kan advares om denne uhyggelige situation ved hjælp af -Xlint, -Xlint: alt, eller -Xlint: endelig. Et stykke kildekode, der viser, hvordan denne advarsel kunne genereres, vises derefter.

/ ** * Demonstrer -Xlint: genererer endelig advarselsmeddelelse, når en {@code endelig} * blok ikke kan ende normalt. * / privat statisk tomrum demonstrereFinallyWarning () {prøv {final double quotient = divideIntegersForDoubleQuotient (10, 0); out.println ("Kvotienten er" + kvotient); } catch (RuntimeException uncheckedException) {out.println ("Fanget undtagelsen:" + uncheckedException.toString ()); }} / ** * Del den angivne skillevæg i det angivne udbytte, og returner * den resulterende kvotient. Der foretages ingen kontrol for at sikre, at skillelinjen ikke er nul. * * @param udbytte Heltal, der skal opdeles. * @param divisor Heltal, hvor udbyttet deles. * @return Kvotient for opdeling af udbytte efter divisor. * / privat statisk dobbelt divideIntegersForDoubleQuotient (final int dividend, final int divisor) {double quotient = 0.0; prøv {if (divisor == 0) {throw new ArithmeticException ("Division med nul ikke tilladt: kan ikke udføre" + dividend + "/" + divisor); } // Dette ville ikke have ført til Xlint: divzero advarsel, hvis vi kom her // med en bogstavelig nul divisor, fordi Infinity simpelthen ville være blevet // returneret snarere end implicit kaste af ArithmeticException. kvotient = (dobbelt) udbytte / divisor; } endelig {return kvotient; }} 

Ovenstående er mangelfuld og er sandsynligvis ikke, hvad udvikleren havde til hensigt. Den relevante advarsel javac giver, når Xlint er aktiveret, vises derefter.

src \ dustin \ eksempler \ Main.java: 159: advarsel: [endelig] endelig klausul kan ikke fuldføres normalt} ^ 

-Xlint: tilsidesætter