Kontrolleret undtagelse vs kørsel undtagelse
Undtagelser er speciel type begivenheder, der kan forstyrre den normale programstrøm. Navneundtagelsen kommer fra "usædvanlig begivenhed". At kaste en undtagelse er processen med at oprette et undtagelsesobjekt og aflevere det til runtime-systemet. Når runtime-systemet modtager undtagelsesobjektet, vil det forsøge at finde nogen til at håndtere det inden for opkaldsstakken ved at krydse det i omvendt rækkefølge (hvor metoderne blev kaldt). Runtime-systemet er vellykket, hvis det finder en metode med en undtagelseshåndterer. Undtagelsesbehandler er en kode med blok, der officielt kan håndtere nævnte undtagelse. Hvis runtime-systemet finder en passende håndterer, vil det give undtagelsesobjektet til handleren. Dette kaldes at fange undtagelsen. Hvis undtagelsen imidlertid ikke kan håndteres, afsluttes programmet. I Java arver undtagelser fra Throwable-klassen. Kontrollerede undtagelser er undtagelser, som håndteringen håndhæves af kompilatoren. Runtime-undtagelser er en type undtagelser, som ikke kontrolleres af kompilatoren.
Hvad er en kontrolleret undtagelse?
Kontrollerede undtagelser er enten objekter i klassen java.lang.exception eller dets underklasser (undtagen java.lang.RuntimeException og dets underklasser). Kontrollerede undtagelser "kontrolleres" på kompileringstidspunktet. Det betyder, at programmereren enten skal fange eller kaste disse undtagelser, ellers vil kompilationen klage (forårsager en compiler-fejl). På grund af denne grund er mange kontrollerede undtagelser meget velkendte for programmerere. For eksempel kontrolleres IOException og dets underklasser undtagelser, og hver gang programmereren har at gøre med at få adgang til eller ændre en fil, kontrollerer compileren for at sikre sig, at alle mulige IOE-undtagelser bliver taget hånd om af programmereren.
Hvad er en Runtime-undtagelse?
Runtime-undtagelser består af java.lang.RuntimeException og alle dens underklasser. Teoretisk set tjener de samme formål som kontrollerede undtagelser og kan kastes eller håndteres som kontrolleret undtagelse, men håndteringen af dem håndhæves ikke af kompilatoren. Derfor hører undtagelser fra kørsel til familien af ukontrollerede undtagelser. NullPointerException, NumberFormatEception, ClassCastException og ArrayIndexOutOfBoundsException er almindelige undtagelser i runtime i Java.
Hvad er forskellen mellem Kontrolleret undtagelse og Runtime Undtagelse?
Selvom både kontrollerede undtagelser og runtime-undtagelser er uønsket forekomst under udførelsen af et program, har de deres forskelle. Kontrolleret undtagelseshåndtering håndhæves af compileren, men undtagelser fra runtime er ikke. Derfor skal kontrollerede undtagelser kastes eller håndteres for at koden kan udarbejdes, men der er ikke et sådant krav vedrørende undtagelser fra runtime. Følgelig hører undtagelser fra runtime til kategorien ikke-markerede undtagelser sammen med fejl.
Ulempen med kontrollerede undtagelser er, at programmereren er nødt til at håndtere det, selvom hun ikke ved, hvordan det skal gøres. Så hvis programmøren bare kaster en ny undtagelse uden at pakke originalen, vil stakesporet, der hører til den originale undtagelse, gå tabt. Det er her undtagelser fra runtime er nyttige. Da alle undtagelser fra runtime kan håndteres et enkelt sted, kan programmerere således skrive mindre mængde kode. På den anden side, da kontrollerede undtagelser skal fanges, er der ingen overraskelse for programmereren. Hun vil altid vide, hvilken kontrolleret undtagelse der kan kastes ved en bestemt metode. I modsætning til dette kan forskellige runtime-undtagelser kastes uden programmerens viden.