Mainos

Poikkeus ohjelmoinnissa tarkoittaa poikkeuksellista tilaa ohjelman suorituksen jossain vaiheessa. Sitä käytetään, kun poikkeuksellisia olosuhteita voidaan käsitellä paremmin muualla kuin sen sijaan, missä se kohtaa. Mieti seuraavia esimerkkejä:

  • Konfiguraatiotiedoston avaamisen epäonnistuminen voidaan hoitaa paremmin koodin yläpuolella, ehkä käyttämällä vaihtoehtoista konfigurointitiedoston sijaintia.
  • Pääsy matriisikohta Kuinka käyttää Java ArrayList -sovellustaJava-taulukko on yleiskäyttöinen koon mukainen taulukko. Se tarjoaa suurimman osan palveluista, joita yleensä odotetaan muiden kielten ryhmistä. Tässä artikkelissa opit määrittelemään ja käyttämään taulukkoa. Lue lisää taulukon rajojen ulkopuolella tarkoittaa ohjelman virhettä. Hyvää virheenkorjausta!
  • XML-jäsennysvirhe tulisi tuoda käyttäjän tietoon, jotta XML-tiedosto voidaan korjata.
  • Ohjelman muisti loppuu (ehkä kun käsittelet suurta tiedostoa) voidaan korjata lisäämällä ehkä Java-prosessin käytettävissä olevaa muistia.

Kaikissa näissä tapauksissa (ja muissakin tapauksissa) poikkeusta on käsiteltävä sen syntypaikan ulkopuolella, jotta taustalla oleva syy voidaan korjata.

Poikkeustyypit

Seuraava kuva näyttää Java-poikkeushierarkian pääosat. Perusluokka on heitettävä joka luokitellaan alaryhmään poikkeus ja Virhe. luokka poikkeus on tarkoitettu ohjelmiin liittyville olosuhteille, jotka sovellukset voivat tarttua yrittäessään pelastaa tilanteen. luokka Virhetoisaalta on tarkoitettu Java Run-time -ympäristössä esiintyvien vakavien virheiden ilmaisemiseen, joita sovellusten ei pitäisi tarttua. Joitakin esimerkkejä ovat: OutOfMemoryError ja StackOverflowError.

Poikkeushierarkia

poikkeus on jälleen kahta tyyppiä: valittu ja ei valittu. Valittu poikkeus on käsiteltävä kutsukoodilla. Tätä sääntöä noudattaa Java-kääntäjä. Toisaalta tarkistamaton poikkeus voidaan levittää puheluketjuun tarvitsematta ilmoittaa sitä nimenomaisesti. Alla olevat esimerkit selventävät.

Tarkistetut poikkeukset

Seuraava menetelmä yrittää luoda FileReader tiedostosta. Rakentaja heittää tarkistetun poikkeuksen FileNotFoundException joka on käsiteltävä kutsukoodilla tai ilmoitettava heitettäväksi.

Seuraava koodi tulee ei koota, koska se ei tee niin.

yksityinen tyhjä loadFile (merkkijonotiedostonimi) {FileReader in = uusi FileReader (tiedostonimi); }

Yksi tapa saada koodi koottavaksi on käsitellä poikkeusta (katso alla).

yksityinen tyhjä loadFile (merkkijonotiedostonimi) {kokeile {FileReader in = new FileReader (tiedostonimi)); {} kiinni (FileNotFoundException ex) {// käsittele poikkeus täällä} }

Jos soittaja ei voi käsitellä poikkeusta suoraan, se on ilmoitettava menetelmän allekirjoituksessa.

yksityinen tyhjä loadFile (merkkijonotiedostonimi) heittää java.io. FileNotFoundException. {FileReader in = uusi FileReader (tiedostonimi)); { }

Valitsemattomat poikkeukset

Tarkkailematon poikkeus on alaluokka RuntimeException eikä niitä tarvitse käsitellä suoraan tai ilmoittaa yllä esitetyllä tavalla. Esimerkiksi seuraava koodi johtaa a NullPointerException, joka on eräänlainen RuntimeException. Koodi kuitenkin kootaan virheettömästi siitä lähtien NullPointerException on tarkistamaton poikkeus.

yksityinen tyhjä kahvaTapahtuma () {Merkkijonon nimi = nolla; if (nimi.pituus ()> 0) {} }

Käärepoikkeukset

Kun otetaan huomioon yllä oleva keskustelu tarkastetuista ja tarkistamattomista poikkeuksista, näyttää siltä, ​​että tarkistamattomiin poikkeuksiin on helpompi käsitellä, koska sinun ei tarvitse ilmoittaa niistä tai käsitellä niitä itse. Tätä mukavuutta ajatellen voi joskus olla hyödyllistä kääriä valittu poikkeus valitsemattomaan poikkeukseen.

Seuraava koodiesimerkki osoitti poikkeuksen käärimisen. Menetelmä method_1 () heittää SQLException sen vartaloon. Jotta koodi koota oikein, poikkeus on ilmoitettava heitetyksi.

yksityinen tyhjä menetelmä_1 () heittää SQLException {... heittää uusi SQLException; }

Kun tähän menetelmään vedotaan toisesta menetelmästä (method_2 ()), menetelmä voi saada kiinni SQLException ja kääri se tarkistamattoman poikkeuksen sisälle, joten sen ei tarvitse ilmoittaa poikkeusta menetelmän allekirjoituksessa.

yksityinen tyhjä menetelmä_2 () {kokeile {menetelmä_1 (); } saalis (java.sql. SQLException ex) {heittää uusi RuntimeException (ex); } }

Poikkeuspinon jäljitys

Poikkeuspinon jäljitys viittaa aktiivisten pinokehysten joukkoon, joista kukin edustaa menetelmän kutsumista, jonka JVM on kaapanut poikkeuksen heittämishetkellä. Jokainen pinokehys sisältää menetelmän kutsumisen sijainnin, mukaan lukien luokan nimi, menetelmän nimi ja mahdollisesti Java-lähdetiedoston nimi ja rivinumero tiedostossa. Se on hyödyllinen puhelujen jäljittämiseen joka aiheutti virheen Java-poikkeukset: käsitteletkö niitä oikein?Poikkeus ohjelmoinnissa tarkoittaa poikkeuksellista tilaa ohjelman suorittamisessa. Sitä käytetään, kun tilaa voidaan hoitaa paremmin muualla. Mieti seuraavia esimerkkejä Java-poikkeusten käsittelystä. Lue lisää .

Tässä on tyypillinen pinojälki, joka saadaan poikkeusobjektista, kun se kiinni.

Poikkeus lanka "pää" java.lang. IndexOutOfBoundsException: Hakemisto: 8, Koko: 5 osoitteessa java.util. ArrayList.rangeCheck (ArrayList.java: 653) osoitteessa java.util. ArrayList.get (ArrayList.java: 429) osoitteessa sample.sample1.main (esimerkki1.java: 24)

Täältä saatu poikkeus on IndexOutOfBoundsException. Se sisältää lisätietoja virheestä. Pinojäljitys sisältää 3 pinokehystä, joista kukin sisältää sijaintitiedot kuvan osoittamalla tavalla.

Poikkeusten käsittely

Poikkeus voidaan hoitaa tarttumalla siihen yritä saada kiinni estää ja toteuttaa tarvittavat korjaavat toimenpiteet. poikkeus Object tarjoaa useita menetelmiä tiedon hankkimiseksi sen aiheuttaneesta tilasta.

Seuraava koodi kirjaa virheilmoituksen lokitiedostoon.

private void loadConfig () {kokeile {// kutsu koodi, joka saattaa tuottaa IOException} saaliin (java.io. IOException ex) {// käsittele poikkeusta täällä. Voidaan kirjata lokitiedostoon. lok.varoitus (ex.getMessage ()); } }

Kun poikkeus on kääritty toisen sisälle, voit palauttaa käärityn poikkeuksen:

Heitettävä syy = ex.getCause (); log.warning ("Perussyy:" + syy.getMessage ()); 

Onko sinun käytettävä pinojäljitystä ja ehkä poistettava sen aiheuttaneen menetelmän nimi?

StringBuilder sbuf = uusi StringBuilder ("Stack Trace:"); varten (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } loki.varoitus (sbuf.toString ());

Tai ehkä, kirjaa poikkeus ja heitä se uudelleen?

yrittää {... } saalis (java.io. IOException ex) {log.warning (ex.getMessage ()); heittää ex; }

poikkeus luokka tarjoaa printStackTrace () menetelmä, jolla voidaan tulostaa pinon jälki omaan PrintStream (tai PrintWriter).

yrittää {... } saalis (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }

Voit saada monen tyyppisiä poikkeuksia yhdestä yrittää estää ja suorittaa erityinen käsittely jokaiselle poikkeustapaukselle.

kokeile {// heittää tähän joitain poikkeuksia. } saalis (java.io. IOException ex) {// IOException -kohtainen käsittely täällä. } saalis (java.sql. SQLException ex) {// SQLException -kohtainen käsittely täällä. }

Voit kiinni useita poikkeustyyppejä, mutta käyttää samaa käsittelykoodia ilmoittamalla a ottaa kiinni estää useita tyyppejä seuraavasti:

kokeile {// heittää tähän joitain poikkeuksia. } saalis (java.io. IOException | java.sql. SQLException ex) {// IOException ja SQLException -kohtaiset käsittelyt täällä. } saalis (SAXException ex) {// SAXException -kohtainen käsittely täällä. }

Resurssien puhdistaminen lopulta

Kun käsitellään koodia, joka voi johtaa poikkeuksiin, on välttämätöntä, että kaikki resurssit puhdistetaan asianmukaisesti, kuten avatut tiedostot Kaikki mitä sinun tarvitsee tietää tiedostomuodoista ja niiden ominaisuuksistaKäytämme sanatiedostoa keskenään: musiikki, kuva, laskentataulukko, diaesitys ja niin edelleen. Mutta mikä tekee tiedostosta joka tapauksessa "tiedoston"? Yritetään ymmärtää tämä olennainen osa tietojenkäsittelyä. Lue lisää , tietokantayhteydet jne. Resurssien puhdistus tulisi suorittaa a vihdoin lohko. Tällä tavalla sekä normaali poistuminen että poikkeuksellinen poistuminen lohkosta kutsuvat siivouskoodi 10 historian pahinta ohjelmointivirhettäKorkeassa menneisyydessä myös koodaus teki tuhoa. Hieman huono koodi aiheutti suurkatastrofin. Seuraavat ovat 10 historian pahimpia ohjelmointivirheitä. Lue lisää .

InputStream sisään = nolla; yrittää {... in = uusi FileInputStream (tiedostonimi);... } saalis (java.io. IOException ex) {log.warning (ex.getMessage ()); } lopulta {// koodi suoritetaan tässä poistuessaan koestuslohkosta, // joko normaalisti tai poikkeuksen vuoksi, jos (in! = nolla) in.close (); }

Kokeile resursseja -lohko

Java 1.7 esitteli kokeile-with-resurssit rakenne, joka helpottaa resurssien puhdistamista. Se näyttää tältä:

Kokeile (InputStream sisään = uusi FileInputStream (..)) {// koodi, joka käyttää InputStreamia. }

Kun koodi poistuu lohkosta (puhtaasti tai poikkeuksen vuoksi), InputStream muuttuja puhdistetaan automaattisesti.

Puhdista useita resursseja julistamalla ne kaikki lohkon päähän.

kokeile (InputStream sisään = uusi FileInputStream (..); Yhteys con =...; ) {// -koodi, joka käyttää InputStream- ja Yhteys-linkkejä. }

Mikä tahansa objekti, jonka luokka toteuttaa AutoCloseable käyttöliittymä voidaan puhdistaa tällä tavalla. Seuraava luokka suorittaa tietyn puhdistuksen kiinni() menetelmä.

julkinen luokka MyClass toteuttaa automaattisen sulkemisen {public void close () {// siivouskoodi täällä} }

Käytä tämän luokan esiintymää kokeile-with-resurssit lohko.

yritä (MyClass obj = uusi MyClass (..)) {// -koodi, joka käyttää MyClass-objektia. }

Joitakin yleisesti esiintyviä poikkeuksia

Katsokaamme nyt joitain yleisesti esiintyviä poikkeuksia.

  • IndexOutOfBoundsException (valittuna): osoittaa, että käytettävän elementin hakemisto on matriisin, merkkijonon jne. rajojen ulkopuolella.
  • SQLException (valittu): heitetty tietokantavirheen vuoksi.
  • IOException (valittu): tiedostojen käyttövirhe tai virheet, jotka liittyvät tuloon ja tulokseen.
  • InterruptedException (valittu): heitetään, kun langan suorittaminen keskeytetään.
  • SAXException (valittu): heitetty XML-jäsennysvirheiden takia.
  • NullPointerException (valittuna): nollan käyttäminen, kun objektia vaaditaan.

Käärimistä

Poikkeukset ovat ensisijainen menetelmä virheiden ilmoittamiseen ja hallintaan Java-sovelluksissa. Poikkeusten oikea käyttö parantaa koodin laatua Kirjoita tai koodaa nopeammin Linux-tekstieditoriin mukautetuilla teemoillaLinux-tekstieditorisi ei tarvitse olla vaalea ja "toimiva". Miksi et mukauta sitä parantaaksesi tuottavuuttasi, skriptien ja koodausten avulla tai käyttämällä työkalua merkintöeditorina? Lue lisää ja apua tuotannon ongelmien ratkaisemisessa.

Onko teillä mitään poikkeuksiin liittyviä sotatarinoita? Jos on, kerro meille siitä alla olevassa kommenttiosassa.

Kuvahyvitys: Dmitry Nikolaev Shutterstock.com-sivuston kautta