Kontrolována výjimka vs. výjimka za běhu
Výjimkou jsou speciální typy událostí, které mohou narušit normální tok programu. Výjimka názvu pochází z „výjimečné události“. Házení výjimky je proces vytvoření objektu výjimky a jeho předání runtime systému. Když systém runtime obdrží objekt výjimky, pokusí se najít někoho, kdo by s ním manipuloval v rámci zásobníku volání jeho procházením v opačném pořadí (ve kterém byly metody vyvolány). Runtime systém je úspěšný, pokud najde metodu s obsluhou výjimky. Obsluha výjimek je blok kódu, který může oficiálně zpracovat uvedenou výjimku. Pokud runtime systém najde vhodný obslužný program, předá objekt výjimky manipulátoru. Tomu se říká chytání výjimky. Pokud však výjimku nelze zpracovat, program se ukončí. V Javě se výjimky dělí od třídy Throwable. Kontrolované výjimky jsou výjimky, u kterých kompilátor vynucuje manipulaci. Výjimky za běhu jsou typem výjimek, které kompilátor nekontroluje.
Co je kontrolovaná výjimka?
Kontrolované výjimky jsou buď objekty třídy java.lang.exception, nebo její podtřídy (kromě java.lang.RuntimeException a jejích podtříd). Kontrolované výjimky jsou „kontrolovány“ v době kompilace. To znamená, že programátor musí tyto výjimky buď zachytit, nebo hodit, jinak by si kompilace stěžovala (způsobila chybu kompilátoru). Z tohoto důvodu je programátorům velmi dobře známo mnoho kontrolovaných výjimek. Například jsou IOException a jeho podtřídy kontrolovány výjimky a kdykoli se programátor zabývá přístupem nebo úpravou souboru, kompilátor zkontroluje, zda programátor pečuje o všechny možné IOExceptions..
Co je výjimka za běhu?
Výjimky za běhu se skládají z java.lang.RuntimeException a všech jeho podtříd. Teoreticky slouží stejnému účelu jako kontrolované výjimky a mohou být hozeny nebo zpracovány jako kontrolované výjimky, ale manipulace s nimi není vynucena kompilátorem. Výjimky za běhu tedy patří do rodiny nekontrolovaných výjimek. NullPointerException, NumberFormatEception, ClassCastException a ArrayIndexOutOfBoundsException jsou běžné běhové výjimky v Javě.
Jaký je rozdíl mezi Checked Exception a Runtime Exception?
Přestože jak kontrolované výjimky, tak výjimky za běhu jsou nežádoucím výskytem během provádění programu, mají své rozdíly. Kompilátor vynucuje kontrolované zpracování výjimek, ale výjimky za běhu nejsou. Aby bylo možné kód zkompilovat, musí být proto zahozeny nebo zpracovány zkontrolované výjimky, ale neexistují žádné takové požadavky týkající se výjimek za běhu. Výjimky za běhu tedy patří do nekontrolované kategorie výjimek spolu s chybami.
Nevýhodou kontrolovaných výjimek je to, že programátor to musí zvládnout, i když neví, jak na to. Pokud tedy programátor právě vyvolá novou výjimku bez zabalení originálu, ztratí se trasování zásobníku patřící k původní výjimce. Zde se hodí výjimky runtime. Protože všechny výjimky runtime lze zpracovat na jednom místě, programátoři tak mohou psát menší množství kódu. Na druhou stranu, protože musí být zachyceny kontrolované výjimky, není pro programátora žádné překvapení. Vždy bude vědět, která kontrolovaná výjimka může být vyvolána určitou metodou. Na rozdíl od toho mohou být vyvolány různé výjimky za běhu bez znalosti programátora.