Vyjímky v Javě (Exceptions in Java) PDF
Document Details

Uploaded by ReasonedSerpentine6765
Tags
Summary
This document covers exceptions in Java. It details defensive programming, exception handling, and the hierarchy of exceptions. It also explains try-catch blocks, custom exceptions, and the use of generics.
Full Transcript
Vyjímky v Javě Defenzivní programování: Přístup k programování, který se zaměřuje na minimalizaci chyb a problémů tím, že se předpokládá, že chyby mohou nastat a že je třeba je zpracovat. Co je to výjimka? Výjimka je událost, která narušuje normální tok programu. V Javě jsou výjimky objekty, které...
Vyjímky v Javě Defenzivní programování: Přístup k programování, který se zaměřuje na minimalizaci chyb a problémů tím, že se předpokládá, že chyby mohou nastat a že je třeba je zpracovat. Co je to výjimka? Výjimka je událost, která narušuje normální tok programu. V Javě jsou výjimky objekty, které jsou instancemi třídy Throwable. Existují tři hlavní typy výjimek: Kontrolované výjimky (checked exceptions): Tyto výjimky jsou kontrolovány kompilátorem. Musíte je buď zpracovat pomocí bloku try-catch , nebo je deklarovat v metodě pomocí klauzule throws. Kontrolované vyjímky jsou podřída třídy Exception.Příkladem kontrolované výjimky je IOException. Nekontrolované výjimky (unchecked exceptions): Tyto výjimky nejsou kontrolovány kompilátorem. Nekotrolované vyjímky jsou podtřídou třídy RuntimeException. Patří sem například NullPointerException , ArrayIndexOutOfBoundsException a ArithmeticException. Tyto výjimky obvykle signalizují chybu v logice programu a měly by být opraveny, nikoli zachycovány. Pokud nejsou zachyceny v kódu, program se ukončí. Chyby (errors): Tyto výjimky signalizují závažné problémy, které obvykle nelze vyřešit. Například OutOfMemoryError nebo StackOverflowError. Tyto výjimky by měly být považovány za fatální a program by měl být ukončen. (Chyby by nikdy neměly být zachycovány!) Hierarchie vyjímek v Javě V Javě existuje hierarchie výjimek, která začíná třídou Throwable. Z ní dědí dvě hlavní třídy: Error a Exception. Třída Exception má další podtřídy, které zahrnují kontrolované a nekontrolované výjimky. Jak fungují výjimky v Javě? V Javě se výjimky zpracovávají pomocí bloků try , catch a finally. Když dojde k výjimce, program přestane vykonávat aktuální blok kódu a přejde do bloku catch , který odpovídá typu výjimky. Blok finally se vykoná vždy, bez ohledu na to, zda došlo k výjimce nebo ne. public class ExceptionExample { public static void main(String[] args) { try { int result = 10 / 0; // Zde dojde k ArithmeticException } catch (ArithmeticException e) { System.out.println("Došlo k dělení nulou: " + e.getMessage()); } finally { System.out.println("Tento blok se vykoná vždy."); } } } Vytváření vlastních výjimek V Javě můžete vytvářet vlastní výjimky tím, že vytvoříte třídu, která dědí z třídy Exception nebo RuntimeException. Můžete také přidat konstruktory pro předání zprávy nebo příčiny výjimky. public class MyCustomException extends Exception { public MyCustomException(String message) { super(message); } public MyCustomException(String message, Throwable cause) { super(message, cause); } } Použití vlastní výjimky v kódu: public class CustomExceptionExample { public static void main(String[] args) { try { throw new MyCustomException("Toto je vlastní výjimka."); } catch (MyCustomException e) { System.out.println("Zachycena vlastní výjimka: " + e.getMessage()); } } } Zpracování více výjimek Pokud chcete zpracovat více různých typů výjimek, můžete použít více bloků catch nebo jeden blok catch s vícero typy výjimek oddělenými symbolem |. public class MultipleExceptionsExample { public static void main(String[] args) { try { int[] numbers = {1, 2, 3}; System.out.println(numbers); // Zde dojde k ArrayIndexOutOfBoundsException } catch (ArrayIndexOutOfBoundsException | ArithmeticException e) { System.out.println("Zachycena výjimka: " + e.getMessage()); } } } Vyhození výjimky Pokud chcete vyhodit výjimku, můžete použít klíčové slovo throw. To se obvykle používá v metodách, které mohou narazit na problém, který nelze vyřešit. public class ThrowExample { public static void main(String[] args) { try { checkAge(15); } catch (MyCustomException e) { System.out.println("Zachycena výjimka: " + e.getMessage()); } } public static void checkAge(int age) throws MyCustomException { if (age < 18) { throw new MyCustomException("Musíte být starší 18 let."); } } } Assert v Javě assert je klíčové slovo v Javě, které se používá k testování podmínek během běhu programu. Pokud podmínka není splněna, vyvolá se AssertionError. Používá se především pro ladění a testování. Pokud se program spustí bez parametru -ea , assert nebude fungovat a nebude vyvolána žádná výjimka. To znamená, že assert by neměl být používán pro kontrolu podmínek, které by měly být splněny v produkčním kódu. -> Není alternativou k výjimkám Příklad použití assert : public class AssertExample { public static void main(String[] args) { int x = 5; assert x > 0 : "x musí být kladné číslo"; // Pokud x není kladné, vyvolá se AssertionError System.out.println("x je kladné číslo: " + x); } } Genericita V Javě Co je genericita? Genericita je vlastnost programovacího jazyka, která umožňuje definovat třídy, rozhraní a metody s typovými parametry. To znamená, že můžete vytvářet obecné datové struktury a algoritmy, které mohou pracovat s různými typy dat bez nutnosti přetypování nebo duplikace kódu. Genericita je užitečná pro zajištění typové bezpečnosti a zjednodušení kódu. V Javě se genericita používá především v kolekcích, jako jsou seznamy, množiny a mapy. Výhody genericity 1. Typová bezpečnost: Genericita umožňuje kompilátoru zkontrolovat typy dat při kompilaci, což snižuje riziko chyb během běhu programu. 2. Znovupoužitelnost kódu: Můžete vytvářet obecné třídy a metody, které mohou pracovat s různými typy dat, což snižuje množství duplikovaného kódu. 3. Flexibilita: Genericita umožňuje vytvářet datové struktury a algoritmy, které mohou pracovat s různými typy dat bez nutnosti přetypování. 4. Snadná údržba: Kód je snadněji udržovatelný, protože můžete měnit typy dat bez nutnosti měnit strukturu kódu. 5. Lepší čitelnost: Kód je čitelnější, protože typy dat jsou explicitně uvedeny, což usnadňuje porozumění tomu, co kód dělá. Definice generických typů V Javě můžete definovat generické třídy a rozhraní pomocí typových parametrů. Typové parametry jsou obvykle označovány jedním nebo dvěma písmeny, jako je T (typ), E (element), K (klíč) a V (hodnota). Typový parametr je umístěn v hranatých závorkách za názvem třídy nebo rozhraní a je zástupníkem pro konkrétní typ, který bude použit při vytváření instance třídy nebo rozhraní. Typový parametr musí být neprimitivní typ, což znamená, že nemůže být použit pro primitivní datové typy jako int , char , boolean atd. Místo toho se používají jejich obalové třídy, jako jsou Integer , Character , Boolean atd. Omezení Nelze použít ve výrazech new T() , protože typ T není známý při kompilaci. Nelze použít statické členy typu T , protože typ T není známý při kompilaci. Nelze použít instanceof s typem T , protože typ T není známý při kompilaci. Nelze použít static metody, inicializátory, bloky a proměné s typem T , protože typ T není známý při kompilaci. Nelze z něj dědit, protože typ T není známý při kompilaci. Nesmí být použity jako typy polí, vyjímek a tříd protože typ T není známý při kompilaci. Modely překladu Specializace kódu Při použití generických typů a metod se vytváří specializované verze kódu pro každý konkrétní typ, který je použit. Například, pokud máte generickou třídu GenericClass , a vytvoříte instanci GenericClass , kompilátor vytvoří specializovanou verzi třídy pro typ Integer. To znamená, že generické typy a metody jsou přeloženy do konkrétních typů během kompilace. Nevýhodou je menší přehlednost a větší velikost kódu, protože pro každý typ se vytváří nová verze třídy nebo metody. Sdílení kódu Generické typy a metody umožňují sdílení kódu mezi různými typy. To znamená, že můžeme psát kód, který je nezávislý na konkrétním typu, a přitom využívá výhod typové bezpečnosti. Například, pokud máte generickou třídu GenericClass , můžete použít stejnou třídu pro různé typy, jako jsou Integer , String nebo Double , aniž byste museli psát duplicitní kód pro každý typ. Nevýhodou je nemožnost použití primitivních typů jako typových parametrů, což může vést k nutnosti přetypování nebo použití obalových tříd. Jak funguje genericita v Javě? Genericita v Javě funguje pomocí typových parametrů, které jsou definovány v hranatých závorkách. Tyto typové parametry mohou být použity k určení typu dat, se kterými třída nebo metoda pracuje. Například: public class GenericClass { private T data; public GenericClass(T data) { this.data = data; } public T getData() { return data; } } V tomto příkladu T představuje typový parametr, který může být nahrazen konkrétním typem při vytváření instance třídy GenericClass. Například: GenericClass stringInstance = new GenericClass("Hello"); GenericClass integerInstance = new GenericClass(42); Použití generických metod Generické metody jsou metody, které mají své vlastní typové parametry. Tyto typové parametry mohou být použity k určení typu dat, se kterými metoda pracuje. Například: public class GenericMethodExample { public static void printArray(T[] array) { for (T element : array) { System.out.println(element); } } public static void main(String[] args) { Integer[] intArray = {1, 2, 3, 4, 5}; String[] strArray = {"A", "B", "C"}; printArray(intArray); printArray(strArray); } } V tomto příkladu metoda printArray je generická a může být použita k tisku jakéhokoli typu pole. Omezování typových parametrů Někdy je užitečné omezit typové parametry na určité třídy nebo rozhraní. To lze provést pomocí klíčového slova extends. Například: public class GenericClass { private T data; public GenericClass(T data) { this.data = data; } public double getDoubleValue() { return data.doubleValue(); } } V tomto příkladu je typový parametr T omezen na třídy, které dědí z třídy Number. To znamená, že můžete použít pouze typy jako Integer , Double , Float atd. Wildcards Wildcards jsou speciální typové parametry, které umožňují flexibilnější použití generických typů. Existují tři hlavní typy wildcardů: 1. Neomezený wildcard ( ? ): Používá se, když neznáte konkrétní typ. Není to Object ! -> List není to samé jako List. public void printList(List list) { for (Object element : list) { System.out.println(element); } } 2. Shora Omezený wildcard ( ? extends T ): Používá se, když chcete povolit pouze typy, které dědí z určité třídy nebo implementují určité rozhraní. Nadtypem nesmí být primitivní typy nebo pole. Neumožnují přístup ke kontruktorům a statickým metodám nadtypů. public void processList(List