Mainos
Ohjelmoinnin aloittelijana Kuinka oppia ohjelmointi ilman stressiäEhkä olet päättänyt jatkaa ohjelmointia joko uran tai vain harrastuksena. Loistava! Mutta ehkä olet alkanut tuntea itsesi uhriksi. Ei kovin hyvä. Tässä on apua matkasi helpottamiseen. Lue lisää , käsite poikkeusten käsittely voi olla vaikea kääriä päätäsi. Ei siitä, että käsite itsessään on vaikea, mutta terminologia voi tehdä siitä näyttävän edistyneemmältä kuin se on. Ja se on niin voimakas ominaisuus, että se on alttiina väärinkäytöksille.
Tässä artikkelissa opit, mitä poikkeuksia on, miksi ne ovat tärkeitä, kuinka niitä käytetään ja yleisiä virheitä, jotka vältetään. Nykyaikaiset kielet 6 helpointa ohjelmointikieltä aloittelijoilleOhjelmoinnissa on kyse oikean kielen löytämisestä yhtä paljon kuin editointiprosessissa. Tässä on kuusi parasta helpointa ohjelmointikieltä aloittelijoille. Lue lisää sinulla on jonkinlainen poikkeusten käsittely, joten jos sinä siirry eteenpäin Java-palvelusta 7 Hyödyllisiä temppuja uuden ohjelmointikielen hallitsemiseen On okei hukkua, kun opit koodaamaan. Unohdat asiat todennäköisesti niin nopeasti kuin opit. Nämä vinkit voivat auttaa sinua säilyttämään kaiken uuden tiedon paremmin. Lue lisää , voit ottaa suurimman osan näistä vinkistä mukaasi.
Java-poikkeusten ymmärtäminen
Java, an poikkeus on esine, joka ilmaisee jotain epänormaalia (tai ”poikkeuksellista”), joka tapahtui sovelluksesi ajon aikana. Tällaisia poikkeuksia ovat heitetään, mikä tarkoittaa periaatteessa poikkeusobjektin luomista (samankaltainen kuin virheiden "nousu").
Kauneus on, että voit ottaa kiinni heitetyt poikkeukset, joiden avulla pystyt käsittelemään epänormaaleja tiloja ja antamaan sovelluksellesi jatkaa toimintaansa ikään kuin mikään menisi pieleen. Esimerkiksi, kun nollaosoitin C: ssä saattaa kaataa sovelluksesi, Java antaa sinun heittää ja kiinni NullPointerException
s ennen kuin nollamuuttujalla on mahdollisuus aiheuttaa kaatuminen.
Muista, että poikkeus on vain esine, mutta sillä on yksi tärkeä ominaisuus: sitä on jatkettava poikkeus
luokka tai mikä tahansa alaluokka poikkeus
. Vaikka Java-ohjelmassa on kaikenlaisia sisäänrakennettuja poikkeuksia, voit myös luoda omia, jos haluat. Jotkut yleisimmät Java-poikkeukset sisältää:
NullPointerException
NumberFormatException
IllegalArgumentException
RuntimeException
IllegalStateException
Joten mitä tapahtuu, kun heität poikkeuksen?
Ensinnäkin Java tutkii välitöntä menetelmää nähdäkseen, onko olemassa koodia, joka käsittelee heittämääsi poikkeustapahtumaa. Jos hoitajaa ei ole, se tarkastelee menetelmää, joka kutsui nykyistä menetelmää, onko kahva olemassa. Jos ei, se tarkastelee menetelmää, joka kutsui että menetelmä ja sitten seuraava menetelmä jne. Jos poikkeusta ei saada, sovellus tulostaa pinojäljen ja kaatuu sitten. (Itse asiassa se on vivahteikkaampaa kuin yksinkertainen kaatuu, mutta se on edistyksellinen aihe, joka ylittää tämän artikkelin soveltamisalan.)
pino jäljittää on luettelo kaikista menetelmistä, joita Java ohitti etsiessään poikkeuskäsittelijää. Pinojälki näyttää tältä:
Poikkeus lanka "pää" java.lang. NullPointerException osoitteessa com.example.myproject. Book.getTitle (Book.java: 16) osoitteessa com.example.omaprojekti. Author.getBookTitles (Author.java: 25) osoitteessa com.example.myproject. Bootstrap.main (Bootstrap.java: 14)
Voimme kerätä siitä paljon. Ensinnäkin heitetty poikkeus oli a NullPointerException
. Se tapahtui getTitle ()
menetelmä Book.javan rivillä 16. Tätä menetelmää kutsuttiin getBookTitles ()
tekijä.javan rivillä 25. Että menetelmä kutsuttiin main ()
Bootstrap.javan rivillä 14. Kuten näette, kaiken tämän tunteminen helpottaa virheenkorjausta.
Mutta jälleen kerran, poikkeusten todellinen etu on, että voit ”käsitellä” epänormaalia tilaa tarttumalla poikkeukseen, asettamalla asiat oikein ja jatkamalla sovellusta kaatumatta.
Java-poikkeusten käyttö koodissa
Sanotaan, että sinulla on someMethod ()
joka ottaa kokonaisluvun ja toteuttaa jonkin logiikan, joka voi rikkoutua, jos kokonaisluku on pienempi kuin 0 tai suurempi kuin 100. Tämä voisi olla hyvä paikka poiketa poikkeuksesta:
public void someMethod (int arvo) {if (arvo <0 || arvo> 100) {heittää uusi IllegalArgumentException
(); } //... }
Saadaksesi tämän poikkeuksen sinun on mentävä minne someMethod ()
kutsutaan ja käytä kokeile saalislohko:
public void callingMethod () {kokeile {someMethod (200); someOtherMethod (); } saalis (IllegalArgumentException e) {// käsittele poikkeus täällä} //... }
Kaikki sisällä yrittää lohko suorittaa järjestyksessä, kunnes poikkeus heitetään. Heti kun poikkeus heitetään, kaikki seuraavat lauseet ohitetaan ja sovelluslogiikka hyppää heti ottaa kiinni lohko.
Esimerkissämme astumme kokeilulupaan ja soitamme välittömästi someMethod ()
. Koska 200 ei ole välillä 0–100, an IllegalArgumentException
heitetään. Tämä päättyy välittömästi someMethod ()
, ohittaa loput logiikkayrityslohkossa (someOtherMethod ()
ei koskaan kutsuta)), ja jatkaa suoritusta saalislohkossa.
Mitä tapahtuisi, jos soitamme joku menetelmä (50)
sen sijaan? IllegalArgumentException
ei koskaan heitetty. someMethod ()
suorittaisi normaalisti. Koelohko suorittaisi normaalisti, soittaen someOtherMethod ()
kun someMethod () valmistuu. Kun someOtherMethod ()
päättyy, salpa estyy ja callingMethod ()
jatkaisi.
Huomaa, että sinulla voi olla useita saalislohkoja koetta kohden:
public void callingMethod () {kokeile {someMethod (200); someOtherMethod (); } kiinni (IllegalArgumentException e) {// käsittele poikkeus täällä} kiinni (NullPointerException e) {// käsittele poikkeusta täällä} //... }
Huomaa myös, että valinnainen vihdoin lohko on myös olemassa:
public void method () {kokeile {//... } saalis (poikkeus e) {//... } lopulta {//... } }
Lopullisessa lohkossa oleva koodi on aina teloitettiin riippumatta siitä, mitä. Jos sinulla on paluulausunto kokeilulohossa, viimeinen lohko suoritetaan ennen paluuta metodista. Jos heität toisen poikkeuksen saalislohkoon, lopullinen lohko suoritetaan ennen poikkeuksen heittämistä.
Sinun tulisi käyttää viimeistä lohkoa, kun sinulla on esineitä, jotka on puhdistettava ennen menetelmän päättymistä. Jos esimerkiksi avasit tiedoston koestuslohkossa ja heitit myöhemmin poikkeuksen, viimeisen lohkon avulla voit sulkea tiedoston ennen metodista poistumista.
Huomaa, että sinulla voi olla lopullinen lohko ilman saalislohkoa:
public void method () {kokeile {//... } lopulta {//... } }
Tämän avulla voit tehdä tarvittavat puhdistukset ja sallia samalla poistetut poikkeukset menetelmän levittämiseksi kutsupino (ts. et halua käsitellä poikkeusta täällä, mutta sinun on silti puhdistettava ensimmäinen).
Tarkistettu vs. Valitsemattomat poikkeukset Java-ohjelmassa
Toisin kuin useimmat kielet, Java erottaa toisistaan tarkastettu poikkeuksia ja tarkistamattomat poikkeukset (esim. C #: llä on vain tarkistamattomia poikkeuksia). Tarkistettu poikkeus on pakko olla kiinni menetelmässä, jossa poikkeus heitetään tai muuten koodia ei koota.
Luo tarkistettu poikkeus laajentamalla poikkeus
. Jatka luomista poimimatta, jotta voit luoda tarkistamattoman poikkeuksen RuntimeException
.
Jokaisen menetelmän, joka heittää valitun poikkeuksen, on merkittävä tämä menetelmän allekirjoitukseen käyttämällä - heittää avainsana. Koska Java on sisäänrakennettu IOException
on valittu poikkeus, seuraavaa koodia ei koota:
public void wontCompile () {//... if (someCondition) {heittää uusi IOException (); } //... }
Sinun on ensin ilmoitettava, että se aiheuttaa tarkistetun poikkeuksen:
public void willCompile () heittää IOException {//... if (someCondition) {heittää uusi IOException (); } //... }
Huomaa, että menetelmä voidaan julistaa poikkeuksen heittämiseksi, mutta koskaan oikein heittää poikkeusta. Tästä huolimatta poikkeus on silti kiinni, tai muuten koodia ei koota.
Milloin sinun pitäisi käyttää valittuja tai valittomia poikkeuksia?
Virallisessa Java-dokumentaatiossa on sivua tähän kysymykseen. Yhteenvetona ero on tiivis peukalosääntö: ”Jos asiakkaan voidaan kohtuudella odottaa parantuvan poikkeuksesta, tee siitä tarkistettu poikkeus. Jos asiakas ei voi tehdä mitään poikkeuksen palauttamiseksi, tee siitä valinnainen poikkeus. "
Mutta tämä ohje saattaa olla vanhentunut. Toisaalta tarkastetut poikkeukset tekevät tuloksena on vankempi koodi 10 vinkkiä puhtaan ja paremman koodin kirjoittamiseenPuhtaan koodin kirjoittaminen näyttää helpommalta kuin se todellisuudessa on, mutta edut ovat sen arvoisia. Näin voit aloittaa puhtaan koodin kirjoittamisen tänään. Lue lisää . Toisaalta mikään muu kieli ei ole tarkistanut poikkeuksia samalla tavalla kuin Java, mikä osoittaa kaksi asiaa: yksi, ominaisuus ei ole tarpeeksi hyödyllinen muille kielille sen varastamiseksi, ja toiseksi, voit ehdottomasti elää ilman niitä. Lisäksi tarkistetut poikkeukset eivät pelaa hienosti Java 8: n käyttöön otetuilla lambda-lausekkeilla.
Ohjeet Java-poikkeusten käyttöön
Poikkeukset ovat hyödyllisiä, mutta niitä voidaan helposti väärinkäyttää ja väärinkäyttää. Tässä on muutamia vinkkejä ja parhaita käytäntöjä, joiden avulla voit välttää sekaannusta niistä.
-
Suosittele erityisiä poikkeuksia yleisiin poikkeuksiin. Käyttää
NumberFormatException
yliIllegalArgumentException
Jos mahdollista, käytä muutenIllegalArgumentException
yliRuntimeException
kun mahdollista. -
Älä koskaan kiinni
heitettävä
!poikkeus
luokka todella ulottuuheitettävä
, ja saalislohko todella toimiiheitettävä
tai mikä tahansa luokka, joka ulottuu heitettäväksi. KuitenkinVirhe
luokka myös laajeneeheitettävä
, ja et koskaan halua kiinniVirhe
koskaVirhe
s osoittavat vakavia palauttamattomia ongelmia. -
Älä koskaan kiinni
poikkeus
!InterruptedException
ulottuupoikkeus
, joten mikä tahansa lohko, joka tarttuupoikkeus
myös kiinniInterruptedException
, ja se on erittäin tärkeä poikkeus, johon et halua sekoittaa (etenkin monisäikeisissä sovelluksissa), ellet tiedä mitä teet. Jos et tiedä mitä poikkeusta sen sijaan kiinni pitää, harkitse saamatta mitään. -
Käytä kuvaavia viestejä virheenkorjauksen helpottamiseksi. Kun heittää poikkeuksen, voit antaa a
jono
viesti argumenttina. Tätä viestiä voidaan käyttää saalislohkossa käyttämälläException.getMessage ()
-menetelmää, mutta jos poikkeusta ei koskaan saada, viesti näkyy myös osana pinoa. -
Yritä olla kiinni ja sivuuttaa poikkeuksia. Voit kiertää tarkistettujen poikkeusten aiheuttamat haitat. Paljon aloittelijoita ja laiskoja ohjelmoijia perustaa saalislohkon, mutta jättää sen tyhjäksi. Huono! Käsittele sitä aina sulavasti, mutta jos et pysty, tulosta ainakin pinojälki, jotta tiedät poikkeuksen heitetyn. Voit tehdä tämän käyttämällä
Exception.printStackTrace ()
menetelmä. - Varo poikkeusten liiallista käyttöä. Kun sinulla on vasara, kaikki näyttää kynneltä. Kun opit ensimmäistä kertaa poikkeuksista, saatat tuntea olevansa velvollinen muuttamaan kaiken poikkeukseksi… siihen pisteeseen, jossa suurin osa sovelluksesi ohjausvirrasta laskee poikkeusten käsittelyyn. Muista, että poikkeukset on tarkoitettu ”poikkeuksellisiin” tapahtumiin!
Nyt sinun pitäisi olla riittävän mukava poikkeuksin, jotta ymmärrät mitä he ovat, miksi niitä käytetään ja kuinka sisällyttää ne omaan koodisi. Jos et ymmärrä käsitettä täysin, se on hyvä! Kesti jonkin aikaa, kunnes se "napsahti" päässäni, niin älä tunne, että sinun täytyy kiirehtiä sitä 6 merkkiä siitä, että et halua olla ohjelmoijaKaikkia ei ole leikattu ohjelmoijaksi. Jos et ole täysin varma, että sinun on tarkoitus olla ohjelmoija, tässä on joitain merkkejä, jotka voivat osoittaa sinut oikeaan suuntaan. Lue lisää . Ei kiirettä.
Onko sinulla kysymyksiä? Tiedätkö muita kaipaamiin poikkeuksiin liittyviä vinkkejä? Jaa ne alla oleviin kommentteihin!
Joel Leellä on B.S. tietotekniikan alalta ja yli kuuden vuoden ammattikirjoittamisen kokemus. Hän on MakeUseOfin päätoimittaja.