Tarkistettu poikkeus vs. ajonaikainen poikkeus
Poikkeukset ovat erityyppisiä tapahtumia, jotka voivat häiritä normaalia ohjelmavirtaa. Nimi poikkeus tulee ”poikkeuksellisesta tapahtumasta”. Poikkeuksen heittäminen on prosessi, jolla luodaan poikkeusobjekti ja luovutetaan se runtime-järjestelmälle. Kun ajonaikainen järjestelmä vastaanottaa poikkeusobjektin, se yrittää löytää jonkun käsittelemään sitä puhelupinossa kuljettamalla sitä käänteisessä järjestyksessä (jossa menetelmiä kutsuttiin). Suoritusaikajärjestelmä onnistuu, jos se löytää menetelmän poikkeuskäsittelijän kanssa. Poikkeuksen käsittelijä on koodilohko, joka pystyy käsittelemään mainittua poikkeusta virallisesti. Jos ajonaikainen järjestelmä löytää sopivan käsittelijän, se välittää poikkeusobjektin käsittelijälle. Tätä kutsutaan poikkeuksen kaappaamiseksi. Jos poikkeusta ei kuitenkaan voida käsitellä, ohjelma päättyy. Java-tilassa poikkeukset perivät Throvable-luokasta. Tarkistetut poikkeukset ovat poikkeuksia, joissa kääntäjä valvoo käsittelyä. Suorituksenaikaiset poikkeukset ovat eräänlaisia poikkeuksia, joita kääntäjä ei tarkista.
Mikä on tarkastettu poikkeus?
Tarkistetut poikkeukset ovat joko luokan java.lang.exception tai sen alaluokan objekteja (paitsi java.lang.RuntimeException ja sen alaluokat). Tarkistetut poikkeukset “valitaan” käännöshetkellä. Tämä tarkoittaa, että ohjelmoijan on joko pyydettävä tai hylättävä nämä poikkeukset, tai muuten kääntäjä valittaa (aiheuttaen kääntäjävirheen). Tästä syystä monet tarkistetut poikkeukset ovat ohjelmoijien hyvin tunnettuja. Esimerkiksi IOException ja sen alaluokat tarkistetaan poikkeuksilla, ja aina kun ohjelmoija käsittelee tiedostoon pääsyä tai sen muuttamista, kääntäjä tarkistaa varmistaakseen, että ohjelmoija on huolehtinut kaikista mahdollisista IOExmissionsista..
Mikä on Runtime poikkeus?
Runtime poikkeukset koostuvat java.lang.RuntimeException ja kaikista sen alaluokista. Teoreettisesti ottaen ne palvelevat samaa tarkoitusta kuin tarkistetut poikkeukset, ja niitä voidaan heittää tai käsitellä kuten tarkistettuja poikkeuksia, mutta kääntäjä ei valvo niiden käsittelyä. Siksi Runtime poikkeukset kuuluvat tarkistamattomien poikkeusten perheeseen. NullPointerException, NumberFormatEception, ClassCastException ja ArrayIndexOutOfBoundsException ovat yleisiä runtime poikkeuksia Java.
Mitä eroa on tarkastetun poikkeuksen ja suorituksenaikaisen poikkeuksen välillä??
Vaikka sekä tarkistetut poikkeukset että ajonaikaiset poikkeukset eivät ole toivottuja tapahtumia ohjelman suorittamisen aikana, niillä on eroja. Kääntäjä valvoo tarkistettujen poikkeusten käsittelyä, mutta ajoajan poikkeukset eivät ole. Siksi valitut poikkeukset on heitettävä tai käsiteltävä koodin kääntämistä varten, mutta ajonaikaista poikkeusta koskevaa vaatimusta ei ole. Tämän seurauksena suorituksen aikaiset poikkeukset kuuluvat virheettömien tarkistamattomien poikkeusten luokkaan.
Haitta tarkistetuilla poikkeuksilla on, että ohjelmoijan on käsiteltävä sitä, vaikka hän ei tiedä miten. Joten, jos ohjelmoija heittää vain uuden poikkeuksen käärimättä alkuperäistä, alkuperäiseen poikkeukseen kuuluva pinojälki katoaa. Tällöin runtime-poikkeukset ovat hyödyllisiä. Koska kaikkia ajonaikaista poikkeuksia voidaan käsitellä yhdessä paikassa, ohjelmoijat voivat kirjoittaa vähemmän koodia. Toisaalta, koska tarkistetut poikkeukset täytyy saada, ohjelmoijalle ei ole yllättävää. Hän tietää aina, mikä tarkistettu poikkeus voidaan heittää tietyllä menetelmällä. Toisin kuin tämä, erilaiset ajoaikapoikkeukset voidaan heittää ohjelmoijan tietämättä.