Kontrollert unntak vs Runtime-unntak
Unntak er spesielle hendelser, som kan forstyrre den normale programflyten. Navnet unntaket kommer fra "eksepsjonell begivenhet". Å kaste et unntak er prosessen med å lage et unntaksobjekt og avlevere det til kjøretidssystemet. Når kjøretidssystemet mottar unntaksobjektet, vil det prøve å finne noen som kan håndtere det i samtalestakken ved å krysse det i omvendt rekkefølge (som metodene ble kalt til). Kjøretidssystemet er vellykket hvis det finner en metode med en unntaksbehandler. Unntakshåndterer er en blokk med kode som offisielt kan håndtere nevnte unntak. Hvis kjøretidssystemet finner en passende behandler, vil det sende unntaksobjektet til behandleren. Dette kalles å fange unntaket. Men hvis unntaket ikke kan håndteres, avsluttes programmet. I Java,unntak arver fra Throwable-klassen. Merkede unntak er unntak som håndteringen håndheves av kompilatoren. Runtime-unntak er en type unntak som ikke kontrolleres av kompilatoren.
Hva er et sjekket unntak?
Merkede unntak er enten objekter i klassen java.lang.exception eller dens underklasser (unntatt java.lang. RuntimeException og dens underklasser). Merkede unntak blir "sjekket" ved kompileringstidspunktet. Det betyr at programmereren enten må fange eller kaste disse unntakene, ellers vil kompilasjonen klage (forårsaker en kompilatorfeil). På grunn av denne årsaken er mange sjekket unntak veldig kjent for programmerere. For eksempel er IOException og dets underklasser sjekket unntak, og når programmereren har å gjøre med å få tilgang til eller endre en fil, kontrollerer kompilatoren for å sikre at alle mulige IOExceptions blir ivaretatt av programmereren.
Hva er et Runtime-unntak?
Runtime Unntak består av java.lang. RuntimeException og alle dets underklasser. Teoretisk sett tjener de samme formål som sjekket unntak, og kan kastes eller håndteres som sjekket unntak, men håndteringen av dem håndheves ikke av kompilatoren. Derfor tilhører Runtime-unntak familien av ukontrollerte unntak. NullPointerException, NumberFormatEception, ClassCastException og ArrayIndexOutOfBoundsException er vanlige unntak for kjøretid i Java.
Hva er forskjellen mellom sjekket unntak og kjøretidsunntak?
Selv om både avmerkede unntak og unntak for kjøretid er uønsket forekomst under utførelsen av et program, har de forskjellene. Kontrollert unntaksbehandling håndheves av kompilatoren, men unntak for kjøretid er ikke. Derfor må kontrollerte unntak kastes eller håndteres for at koden skal kunne kompileres, men det er ikke noe slikt krav angående unntak for kjøretid. Følgelig tilhører unntak for kjøretid til ukontrollerte unntakskategorier sammen med feil.
Ulempen med avmerkede unntak er at programmereren må håndtere det selv om hun ikke vet hvordan. Så hvis programmereren bare kaster et nytt unntak uten å pakke inn originalen, vil stacksporingen som hører til det opprinnelige unntaket gå tapt. Dette er hvor runtime-unntak kommer til nytte. Fordi alle unntak for kjøretid kan håndteres på ett sted, kan programmerere skrive mindre mengde kode. På den annen side er det ingen overraskelse for programmereren siden kontrollerte unntak må fanges opp. Hun vil alltid vite hvilket avkrysset unntak som kan kastes etter en bestemt metode. I motsetning til dette, kan ulike unntak for kjøretid kastes uten kjennskap fra programmereren.