Kontrollitud erand vs käituse erand
Erandid on eritüüpi sündmused, mis võivad häirida programmi tavapärast voogu. Nimeerand pärineb „erakordsest sündmusest“. Erandi viskamine on protsess, mille käigus luuakse erandobjekt ja antakse see käitussüsteemile üle. Kui käitussüsteem saab erandobjekti, püüab ta leida kedagi, kes seda kõnepinu sees käitleks, läbides selle vastupidises järjekorras (milles meetodeid kutsuti). Käitusaja süsteem on edukas, kui ta leiab meetodi koos erandihalduriga. Erandite käitleja on koodiplokk, mis saab nimetatud erandit ametlikult käsitleda. Kui käitussüsteem leiab sobiva käitleja, edastab ta erandi objekti käitlejale. Seda nimetatakse erandi püüdmiseks. Kui aga erandiga ei saa hakkama, siis programm lõpetatakse. Java keeleserandid pärinevad klassist Throwable. Märgitud erandid on erandid, mille kompilaator sunnib käsitsema. Käitusaja erandid on teatud tüüpi erandid, mida kompilaator ei kontrolli.
Mis on kontrollitud erand?
Märgitud erandid on kas klassi java.lang.exception objektid või selle alamklassid (välja arvatud java.lang. RuntimeException ja selle alaklassid). Märgitud erandid "kontrollitakse" kompileerimise ajal. See tähendab, et programmeerija peab need erandid kas püüdma või viskama, muidu kompileeriks kaebusi (põhjustades kompilaatori viga). Seetõttu on paljud kontrollitud erandid programmeerijatele väga hästi teada. Näiteks IOException ja selle alamklassid on kontrollitud erandid ja alati, kui programmeerija tegeleb failile juurdepääsu või selle muutmisega, kontrollib kompilaator veendumaks, et programmeerija hoolitseb kõigi võimalike IOExceptsioonide eest.
Mis on käituse erand?
Käitusaja erandid koosnevad java.lang. RuntimeExceptionist ja kõigist selle alamklassidest. Teoreetiliselt võib öelda, et neil on sama eesmärk kui kontrollitud eranditel ja neid saab visata või käsitseda nagu kontrollitud erandeid, kuid kompilaator ei salli nende käitlemist. Seetõttu kuuluvad käitamisaja erandid kontrollimatute erandite hulka. NullPointerException, NumberFormatEception, ClassCastException ja ArrayIndexOutOfBoundsException on Java-s tavalised käitamiserandid.
Mis vahe on kontrollitud erandil ja käituse erandil?
Kuigi nii kontrollitud erandid kui ka käituse ajal kehtivad erandid on programmi käivitamisel soovimatud, on neil erinevusi. Kontrollitud erandite käitlemist sunnib kompilaator, kuid käitamise erandeid mitte. Seetõttu tuleb koodi kompileerimiseks visata kontrollitud erandid või neid käsitseda, kuid käitamiserandite osas sellist nõuet pole. Sellest tulenevalt kuuluvad käitamiserandid koos vigadega kontrollimata erandite kategooriasse.
Kontrollitud erandite puuduseks on see, et programmeerija peab sellega hakkama saama, isegi kui ta ei oska. Niisiis, kui programmeerija viskab uue erandi lihtsalt originaali pakkimata, kaotatakse algsele erandile kuuluv virnajälg. Siin tulevad käitusaja erandid kasuks. Kuna kõiki käitamiserandeid saab käsitleda ühes kohas, saavad programmeerijad vähem koodi kirjutada. Teisest küljest, kuna kontrollitud erandid tuleb tabada, pole programmeerijal mingit üllatust. Ta teab alati, millise kontrollitud erandi võiks teatud meetodiga visata. Vastupidiselt sellele võib programmeerija teadmata visata erinevaid käitamiserandeid.