Kontrollitud erand vs tööaja erand
Erandid on eriliigid sündmused, mis võivad häirida tavapärast programmivoogu. Nime erand tuleneb „erandlikust sündmusest“. Erandi viskamine on erandobjekti loomise ja käitamissüsteemile üleandmise protsess. Kui käitustõmmise süsteem võtab erandobjekti vastu, proovib ta leida kõnekõnes keegi, kes seda käsitseks, liikudes vastupidises järjekorras (milles meetodeid kutsuti). Kätlussüsteem on edukas, kui see leiab meetodi erandkäitlejaga. Erandkäitleja on koodiplokk, mis saab nimetatud erandiga ametlikult hakkama. Kui käitamissüsteem leiab sobiva käitleja, edastab see erandiobjekti käitlejale. Seda nimetatakse erandi püüdmiseks. Kui erandit ei saa siiski lahendada, lõpetatakse programm. Jaavas pärivad erandid Throvable klassist. Kontrollitud erandid on erandid, mille korral kompilaator jõustab käitlemise. Käitusaja erandid on teatud tüüpi erandid, mida kompilaator ei kontrolli.
Mis on kontrollitud erand?
Kontrollitud erandid on kas klassi java.lang.exception või selle alaklasside objektid (välja arvatud java.lang.RuntimeException ja selle alaklassid). Kontrollitud erandid kontrollitakse kompileerimise ajal. See tähendab, et programmeerija peab need erandid kas kinni püüdma või nendest loobuma, vastasel juhul kompileerija kaebab (põhjustab kompilaatori tõrke). Seetõttu on programmeerijatele teada paljud kontrollitud erandid. Näiteks kontrollitakse erandeid IOException ja selle alamklasse ning alati, kui programmeerija tegeleb failile juurdepääsu või selle muutmisega, kontrollib kompilaator veendumaks, et programmeerija hoolitseb kõigi võimalike IOExceptionide eest..
Mis on Runtime erand?
Runtime erandid koosnevad java.lang.RuntimeException ja kõigist selle alamklassidest. Teoreetiliselt on neil sama eesmärk kui kontrollitud eranditel ja neid saab visata või käidelda nagu kontrollitud erandeid, kuid nende käsitsemist kompilaator ei taga. Seetõttu kuuluvad Runtime-erandid kontrollimata erandite hulka. NullPointerException, NumberFormatEception, ClassCastException ja ArrayIndexOutOfBoundsException on Java-s tavalised käitusaja erandid.
Mis vahe on kontrollitud erandil ja tööaja erandil??
Ehkki nii kontrollitud erandid kui ka käitusaja erandid on programmi täitmise ajal soovimatud, on neil oma erinevused. Kontrollitud erandite käsitlemist juhib kompilaator, kuid käitusaja erandid pole. Seetõttu tuleb koodi kompileerimiseks kontrollitud erandid visata või käidelda, kuid käitamisaja erandite kohta sellist nõuet ei ole. Järelikult kuuluvad käitusaja erandid kontrollimata erandite kategooriasse koos vigadega.
Puuduseks kontrollitud eranditega on see, et programmeerija peab sellega hakkama saama isegi siis, kui ta ei tea, kuidas seda teha. Niisiis, kui programmeerija viskab lihtsalt uue erandi originaali mähistamata, kaob algsesse erandisse kuuluv virnajälg. See on koht, kus käitusaja erandid on kasulikud. Kuna kõiki käitusaja erandeid saab käsitleda ühes kohas, saavad programmeerijad kirjutada vähem koodi. Teisest küljest, kuna kontrollitud erandeid tuleb püüda, pole programmeerijale üllatust. Ta teab alati, millise kontrollitud erandi võib teatud meetodil visata. Vastupidiselt sellele saab programmeerija teadmata visata mitmesuguseid käitusaja erandeid.