Ohjelmointi

javacin -Xlint-asetukset

Oraclen (ja aiemmin Sunin) toimittamalla Java-ohjelmointikielen kääntäjällä (javac) on useita epätyypillisiä vaihtoehtoja, jotka ovat usein hyödyllisiä. Yksi hyödyllisimmistä on joukko epätyypillisiä asetuksia, jotka tulostavat kokoamisen aikana havaitut varoitukset. Tämä joukko vaihtoehtoja on tämän viestin aihe.

Javac-sivun osa ei-vakiovalinnaisluetteloista sisältää lyhyt yksityiskohdat näistä vaihtoehdoista. Seuraava on kyseisen sivun asiaankuuluva katkelma.

Luettelo näistä vaihtoehdoista on saatavana myös komentoriviltä (olettaen, että Java SDK on asennettu) komennolla: javac -help -X. Tämä on lyhyempi kuin yllä esitetty man-sivu / verkkosivun esimerkki ja näkyy seuraavana.

Kuten edellinen tilannekuva käynnissä javac -apu -X osoittaa, että kymmenen erityisehtoa, joille Xlint-varoitukset ovat olemassa, ovat (aakkosjärjestyksessä): heittää, vanhentuminen, Divzero, tyhjä, läpimurto, lopulta, ohittaa, polku, sarjaja tarkastamaton. Tarkastelen lyhyesti kaikkia näitä ja annan koodinpätkän, joka johtaa näihin varoituksiin, kun Xlint käynnistetään. Huomaa, että javacin man-sivu ja Java SE 6 -javac-sivu sisältävät molemmat vain puolet näistä Xlint-vaihtoehdoista (ohjeet eivät ilmeisesti ole yhtä ajan tasalla kuin javacin käyttö / ohje). On hyödyllinen NetBeans Wiki -merkintä, joka sisältää yhteenvedon kaikista kymmenestä vaihtoehdosta.

Javac-kääntäjä sallii kaikkien Xlint-varoitusten ottamisen käyttöön tai ei yhtään. Jos Xlint-asetusta ei ole määritelty lainkaan -Xlint: -vaihtoehdossa ei ole erikseen määritelty, toiminto ei näytä suurinta osaa varoituksista. Mielenkiintoista on, että tulos antaa varoituksen vanhentumisesta ja tarkistamattomista varoituksista ja suosittelee javacin suorittamista -Xlint-toiminnolla, jotta näet näiden kahden varoituksen tyypin yksityiskohdat.

Ennen tämän viestin loppua esittelen Java-koodin, joka johtaa 13 ilmoitettuun Xlint-varoitukseen, jotka kattavat kaikki kymmenen edellä mainittua vaihtoehtoa. Ilman Xlint-määritystä lähtö on kuitenkin seuraavan näytön tilannekuvan mukainen.

Kuten yllä olevasta kuvasta käy ilmi, onko Xlintiä määritetty lainkaan vai onko se määritelty nimenomaisesti "ei mitään", tulos on sama: Suurinta osaa varoituksista ei näytetä, mutta käytöstä poistamiseen ja tarkistamattomiin varoituksiin on yksinkertaisia ​​viitteitä Jos haluat suorittaa javac-toiminnon -Xlint: deprecation ja -Xlint: -valinnalla, tarkista vastaavasti lisätietoja. Javacin käyttäminen -Xlint: all tai -Xlint -toiminnolla ilman muita vaihtoehtoja näyttää kaikki varoitukset ja pyrkii näkemään vanhentuneita, valitsemattomia ja kaikkia muita soveltuvia Xlint-yhteensopivia varoituksia koskevat tiedot. Tämä näkyy, kun olet käynyt läpi lähdekoodin ja jokaisen Xlint-varoituksen erikseen.

-Xlint: valettu

Tätä asetusta voidaan käyttää kääntäjän varoittamaan kehittäjää siitä, että redundantti näyttelijä on tekemässä. Tässä on koodinpätkä, joka merkitään, jos -Xlint, -Xlint: all tai -Xlint: cast toimitettiin javaciin lähdettä koottaessa.

/ ** * Osoittaa -Xlint: varoitus turhasta näytteestä. * / private static void demonstrCastWarning () {final Set people = new HashSet (); ihmiset. lisätty (fred); ihmiset. lisätty (wilma); ihmiset. lisää (barney); for (viimeinen henkilö henkilö: ihmiset) {// tarpeeton näyttelijä, koska yleinen tyyppi on nimenomaisesti Henkilö ulos.println ("Henkilö:" + ((Henkilö) henkilö) .getFullName ()); }} 

Yllä olevassa koodissa ei tarvitse heittää henkilöobjektia for-silmukan sisällä kohtaan Henkilö ja -Xlint: valettu varoittaa tästä tarpeettomasta ja turhasta heitosta viestillä, jossa kerrotaan esimerkiksi:

src \ dustin \ esimerkit \ Main.java: 37: varoitus: [valettu] turha valettu osaksi pölyä.esimerkkejä.Personi.tulosta ln ("Henkilö:" + ((Henkilö) henkilö). ^ 

-Xlint: poistaminen käytöstä

Kuten edellä keskusteltiin, Xlintin käytöstä poistamista koskevaa varoitusta pidettiin ilmeisesti riittävän tärkeänä sen perustelemiseksi, vaikka Xlintiä ei nimenomaisesti ajettaisikaan. Tämä varoitus tapahtuu, kun käytetään vanhentunutta menetelmää. Seuraava koodiesimerkki osoittaa tällaisen tapauksen.

/ ** * Syy -Xlint: vanhentunut tulostaa varoituksen vanhentuneen menetelmän käytöstä. * / private static void demonstrDeprecationWarning () {out.println ("Fredin koko nimi on" + fred.getName ()); } 

Et voi kertoa ilman Henkilöluokan lähdekoodia (jonka esiintymä on "fred"), mutta menetelmä getName () on vanhentunut Henkilössä. Seuraava javac-suorituksen tuloste -Xlint, -Xlint: all tai -Xlint: deprecation vahvistaa sen (tai osoittaa sen, jos kehittäjä ei onnistunut).

src \ dustin \ esimerkit \ Main.java: 47: varoitus: [deprecation] getName () kohdassa dustin.examples.Person on vanhentunut out.println ("Fredin koko nimi on" + fred.getName ()); ^ 

-Xlint: divzero

Divzero Xlint -vaihtoehto ilmoittaa, kun integraalijako jakautuu kirjaimellisella nollalla. Koodiesimerkki, joka osoittaa tämän, näkyy seuraavaksi:

/ ** * Osoita -Xlint: divzero toiminnassa jakamalla int kirjaimellisella nollalla. * / private static void demonstrDivideByZeroWarning () {out.println ("Kaksi jaettuna nollalla on" + divideIntegerByZeroForLongQuotient (2)); } / ** * Jaa annettu jakaja annettuun osinkoon ja palauta tuloksena oleva osamäärä. Ei tarkistuksia sen varmistamiseksi, että jakaja ei ole nolla. * * @param osinko Jaettava kokonaisluku. * @return Osinko jakautuu kirjaimellisesti nollalla. * / private static long divideIntegerByZeroForLongQuotient (final int dividend) {// Kovakoodattu nollan jakaja johtaa varoitukseen. Jos jakaja olisi // syötetty parametrina, jolla on nolla-arvo, se ei johtaisi varoitukseen. tuotto-osinko / 0; } 

Javacin tulos, kun yllä oleva on koottu, näytetään nyt.

src \ dustin \ esimerkit \ Main.java: 231: varoitus: [divzero] jakaminen nollatuoton osingolla / 0; ^ 

Kun yritin tarkoituksellisesti pakottaa tämän varoituksen, se näytti toimivan vain kovakoodatun (kirjaimellisen) nollanjakajan kohdalla. Se ei myöskään merkitse kaksoisjakoa, koska Ääretön voidaan palauttaa pätevänä vastauksena tällöin ilman poikkeusta.

-Xlint: tyhjä

Tarkoitus -Xlint: tyhjä on ilmoittaa kehittäjälle, että "tyhjä" jos ehdollinen on koodissa. Testini mukaan tämä näyttää soveltuvan vain tyhjän "jos" -lohkon tapaukseen. NetBeans tarjoaa "vihjeitä" (keltaiset alleviivatut varoitukset, jotka on merkitty myös lähdekoodieditorin oikeaan reunaan) monentyyppisille tyhjille lausekkeille, mutta -Xlint: tyhjä näyttää merkitsevän vain tyhjät "jos" -lausekkeet. Lisäsin muut, jotka NetBeans liputtaa yhdessä -Xlint: tyhjä liput seuraavassa lähdekoodinäytteessä.

/ ** * Tämä menetelmä osoittaa, kuinka javacin -Xlint: empty toimii. Huomaa, että javacin * -Xlint: empty merkitsee vain "if" -lohkossa olevan tyhjän käskyn, mutta ei merkitse tyhjiä käskyihin, jotka liittyvät do-while -silmukkaan, * while-silmukkaan, for-silmukkaan tai jos -muu. NetBeans merkitsee nämä, jos * sopivat "vihjeet" ovat käytössä. * / private static void demonstrEmptyWarning () {int [] kokonaisluvut = {1, 2, 3, 4, 5}; if (kokonaisluvut.pituus! = 5); out.println ("Ei viisi?"); if (kokonaisluvut.pituus == 5) out.println ("Viisi!"); muu; out.println ("Ei viisi!"); tehdä; while (kokonaisluvut.pituus> 0); for (int kokonaisluku: kokonaisluvut); out.println ("Toinen kokonaisluku löytyi!"); int-laskuri = 0; kun (laskuri <5); out.println ("Ylimääräiset puolipisteet") ;;;; } 

Yllä oleva koodi on täynnä puolipisteiden ongelmallista sijoittamista, jotka eivät varmasti ole kehittäjän haluamia. Tämä koodi kootaan, mutta kehittäjää varoitetaan näistä epäilyttävistä tilanteista, jos -Xlint, -Xlint: kaikkitai -Xlint: tyhjä käytetään javacin kanssa. Muuten onnistuneessa kokoelmassa tulostetut varoitusviestit näytetään seuraavana.

src \ dustin \ esimerkit \ Main.java: 197: varoitus: [tyhjä] tyhjä käsky if if (kokonaisluvut.pituus! = 5) jälkeen; ^ 

Vain tyhjä "if" -lauseke on merkitty; muut eivät ole ilmoittaneet -Xlint: tyhjä.

-Xlint: läpimurto

Houkutteleva, mutta kiistanalainen mukavuus, jonka Java tarjoaa, on kyky "läpimurtoa" a vaihtaa käsky soveltaa samaa logiikkaa useaan integraaliarvoon yhdellä koodilla. Jos kaikki integroidut arvot jaetulla toiminnallisuudella ovat tyhjät, lukuun ottamatta viimeistä, joka todella suorittaa toiminnon ja tarjoaa a tauko, -Xlint: läpimurto ei aktivoida. Kuitenkin, jos jotkut tapauksessa lausekkeet suorittavat oman logiikkansa yleisen läpilyöntilogiikan lisäksi, tämä varoitus tuotetaan. Seuraavassa esitetään esimerkit, jotka osoittavat tämän.

/ ** * Syy -Xlint: läpimurto tulostusvaroitukseen kytkimen / kotelon käytöstä * putoaminen. * / private static void demonstrateFallthroughWarning () {out.print ("Wilman suosikkiväri on"); out.print (wilma.getFavoriteColor () + ", mikä on"); // tarkista onko 'taiteellinen' pääväri // HUOMAUTUS: Tämä ei johda -Xlint: läpimurtoon varoituksen merkitsemisestä // koska mitään toimintoa ei sisälly mihinkään tapauslausekkeeseen // joilla ei ole omaa tauko. kytkin (wilma.getFavoriteColor ()) {tapaus SININEN: tapaus KELTAINEN: tapaus PUNAINEN: out.print ("taiteellisten pyrkimysten pääväri"); tauko; case MUSTA: case BROWN: case CORAL: case EGGSHELL: case GREEN: case MAUVE: case ORANGE: case PINK: case PURPLE: case TAN: case WHITE: oletus: out.print ("EI taiteellinen ensisijainen väri"); } out.print ("ja on"); // tarkista onko lisäaineiden pääväri // HUOMAUTUS: Tämä kytkin johtaa -Xlint: läpimurtoon, joka antaa varoituksen // koska tapauksessa suoritetaan joitain toimintoja // lausekkeella, jolla ei ole omaa katkaisulauseketta . kytkin (wilma.getFavoriteColor ()) {tapaus SININEN: tapaus VIHREÄ: out.println ("(ei ole helppoa olla vihreä!)"); tapaus RED: out.println ("lisäaineiden pääväri."); tauko; case MUSTA: case BROWN: case CORAL: case EGGSHELL: case MAUVE: case ORANGE: case PINK: case PURPLE: case TAN: case KELTAINEN: case WHITE: oletus: out.println ("EI ensisijainen lisäaine."); }} 

Yllä oleva koodiesimerkki näyttää tarkoituksella kytkimen / kotelon molemmat tapaukset (pun-sanat), jotka johtavat ja eivät johda varoitusviestiin -Xlint: läpimurto. Lähtö, jossa on vain yksi varoitus, näkyy seuraavana.

src \ dustin \ esimerkit \ Main.java: 95: varoitus: [läpimurto] mahdollinen kaatuminen tapaukseen RED: ^ 

tapauksessa joka sai lipun, oli PUNAINEN tapauksessa seuraamalla VIHREÄÄ tapauksessa joka teki jonkin verran omaa logiikkaa ennen kuin siirtyi RED-logiikkaan.

-Xlint: lopulta

Useampi kuin yksi henkilö on varoittanut: "Älä palaa viimeisessä lausekkeessa." Itse asiassa "Java-paluu ei aina" ole Java Hall of Shame -tapahtumassa. Java-kehittäjä voidaan varoittaa tästä ilkeästä tilanteesta käyttämällä -Xlint, -Xlint: kaikkitai -Xlint: lopulta. Seuraavaksi näytetään pala lähdekoodia, joka osoittaa, kuinka tämä varoitus voidaan luoda.

/ ** * Osoita -Xlint: lopulta luodaan varoitusviesti, kun {@code last} * -lohko ei voi loppua normaalisti. * / private static void demonstrateFinallyWarning () {yritä {lopullinen kaksinkertainen osamäärä = divideIntegersForDoubleQuotient (10, 0); out.println ("Osamäärä on" + osamäärä); } catch (RuntimeException uncheckedException) {out.println ("kiinni poikkeus:" + uncheckedException.toString ()); }} / ** * Jaa annettu jakaja annettuun osinkoon ja palauta tuloksena oleva * osamäärä. Ei tarkistuksia sen varmistamiseksi, että jakaja ei ole nolla. * * @param osinko Jaettava kokonaisluku. * @param divisor Kokonaisluku, jolla osinko jaetaan. * @return Laskuri osingonjaosta jakajalla. * / yksityinen staattinen kaksoisjakoIntegersForDoubleQuotient (lopullinen int-osinko, lopullinen int-jakaja) {kaksinkertainen osamäärä = 0,0; kokeile {if (divisor == 0) {heittää uusi ArithmeticException ("Jakaminen nollalla ei ole sallittua: ei voi suorittaa" + osinko + "/" + jakaja); } // Tämä ei olisi johtanut Xlint: divzero -varoitukseen, jos pääsisimme tänne // kirjaimellisella nollanjakajalla, koska Ääretön olisi yksinkertaisesti // palautettu eikä implisiittisesti heitetty ArithmeticException. osamäärä = (kaksinkertainen) osinko / jakaja; } lopuksi {paluuosamäärä; }} 

Yllä oleva on puutteellinen eikä todennäköisesti ole sitä, mitä kehittäjä tarkoitti. Asiaankuuluva varoitus javac antaa, kun Xlint on käytössä, näkyy seuraavaksi.

src \ dustin \ esimerkit \ Main.java: 159: varoitus: [vihdoin] lauseketta ei voi täydentää normaalisti} ^ 

-Xlint: ohittaa