Zdravím ľudia. Prosím vás, vie mi niekto povedať niečo o výnimkách? Prečo ich použiť, kedy.. O čo vlastne ide ? v literatúre som našiel naozaj málo..viac menej len to ako ich nakodiť..ale stále neviem prečo majú takú váhu akú majú...robím projekt do školy a musím dodržať to, že tam bude pár výnimiek, ale vo všeobecnosti neviem kedy, ako a prečo ich použiť
Fórum › Java
Výnimky. Kedy a prečo?
#1 thomas
to je poměrně jednoduchý... zkusim to popsat na pár příkladech...
už v samotný javě existuje plno různých metod, který můžou padnout na různých událostech a pokud neodchytíš vyjímku, tak ti ve většině případech spadne celá app (pokud se jedná o systémovou)
naprosto typická vyjímka je IOException, kterou vyhazuje plno metod, který pracujou s IO (např. čtení/zápis do souborů, streamů apod.),.. si představ, že se pokusíš třeba zapsat něco do souboru, ale kvůli tomu, že ho již jiná aplikace používá, tak ti to vyhodí vyjímku a pokud by si ji neodchytil, tak crash
konkrétně zrovna IOException neni runtime vyjímka, takže jí musíš ošetřit vždy, ale pro představu snad stačí
potom si vyjímky můžeš naimplementovat i ve vlastních metodách.. např. pokud parametr metody bude mít špatnej formát, bude null nebo cokoliv, tak můžeš vyhodit vyjímku a už je na uživateli jak se v takovým případě zachová
představ si, že máš vlastní metodu, která se připojí k serveru a třeba stáhne obrázek na disk do souboru... chcípnout to může hned na několika místech - přípojení k síti, k serveru, chyba při stahování, otevření souboru, zápisu,... pro tyhle případy si klidně vytvoříš vlastní vyjímky a metoda bude vyhazovat třeba "ConnectionException", "DownloadException", "IOException" a když uživatel bude metodu používat a nastane nějaká vyjímka, tak si může díky try-catch pořašit co se má stát, když třeba selže připojení k serveru apod.
potom je dobrý rozlišovat mezi runtime a system vyjímkama a zvolit je na správných místech, můžeš taky odchytit vyjímku, udělat při odchycení nějakou logiku a poslat vyjímku dál, ale to už je spíše ve větších app a ně ve školních
Dobrým příkladem, kdy využít výjimky by mohl být tento:
Programuješ svůj modul, který se stará o připojení k databázi. V něm si vyhodíš několik vlastních výjimek (třeba ConnectionException, WrongParamException).
Následně v aplikaci, kde tento modul budeš používat, zachytáváš právě ty výjimky, které vyhazuje tvůj modul. Navíc to má tu výhodu, že při změně databáze, si pouze přepíšeš svůj modul, který se o připojení stará a samostatná aplikace se nemění (včetně těch výjimek, které odchytáváš).
Jiným příkladem vlastních výjimek může být webová služba. Navenek nechceš vyhazovat všechny možné výjimky, ale můžeš je zaobalit například do BusinessException nebo TechnicalException. Pak ten, kdo tvou webovou službu používá uvidí jen tyto dvě výjimky (samozřejmě s nějakým rozumným popisem) a nedostane se k němu třeba výjimky z modulu (připojení do databáze) ConnectionException.
normalne je ze metoda ma nejaky vstup (parametre) a nejaky vystup ... pri konverzii vstupu na vystup ale moze nastat vynimka
najcastejsie vynimky su NullPointerException, IllegalArgumentException a IllegalStateException ... null pointer dostanes ked to nerobis objektovo a niekto ti namiesto objektu posle null (tato sa vecsinou vytvori automaticky ked volas clenov toho objektu - ktory je ale null)
illegal argument je ked ti niekto posle zly parameter ... napr prijimas String o dlzke max 20 znakov a on ti posle 21 alebo pri hesle das podmienku aspon jedno velke pismenu a on ti ho neposle (v tomto pripade sa moze oplatit vytvorit si vlastnu exception ktora rozsiruje illegal argument aby si ju vedel lepsie zachytit)
illegal state je ked mas nejaku vrstvu ktora si uklada stav a nieje mozne vykonat metodu teraz ... napr auto sa ti moze pokazit a ked od neho chces aby jazdilo tak parametre mozu byt spravne ale je v zlom stave
je trochu problem rozlisit kedy ma byt chyba checked a kedy unchecked ... ked ich das vsetky ako RuntimeException tak by si mal pisat javadoc aby si vedel co sa moze stat ale zase nemusis ich vsetky zachytavat ... ked ich das vsetky ako checked tak ich musis vsetky riesit cez try catch co vie priniest vela bordelu do kodu ... musis si vzdy predstavit ako by sa to malo pouzivat
https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
#1 thomas
Když voláš nějakou funkčnost v programu, tak předpokládáš, že to dopadne dobře a obdržíš nějaký výsledek nějakého typu. Občas se něco nepodaří a nedostaneš žádný výsledek. Nějak však musíš zjistit, proč jsi ten výsledek nedostal. Zpráva o chybě má ale jinou strukturu a proto se musí přenášet jiným způsobem než výsledek. Nejlépe výjimkami.
#6 Kit
Když voláš nějakou funkčnost v programu, tak předpokládáš, že to dopadne dobře a obdržíš nějaký výsledek nějakého typu.
to plati pri unchecked exception ktore necakas ze nastanu ... pri checked exception cakas ze to dopadne dobre alebo dostanes vysledok s chybou ktoru by si mal vyriesit
tiez sa neoplati povazovat kazdu deviaciu za exception ... nespravne heslo moze byt exception ale stlacenie cancel vo vyskakovacom okne sa oplati riesit inak ... pri vytvarani exception sa musi zbierat stacktrace ktory moze byt znacne dlhy
#7 Flowy
Nevidím důvod, proč by cancel ve vyskakovacím okně měl vyvolávat výjimku. Vždyť to není chyba!
Argumentaci o délce stacktrace považuji za nesmyslnou. Výjimky nemají sloužit pro řízení programu, ale pokud dojde k chybě, vyhazuji výjimku bez ohledu na délku stacktrace.
#8 Kit
důvod třeba nevidíš, ale ve skutečnosti vyhodit vyjímku může i cancel.. vem si třeba příklad z close() u streamu, kde taktéž nedává smysl vyhazovat vyjímku (aspoň mě), ale vyhazuje se.. nikdy nevíš, co ta logika za tím dělá a který zavírací nebo ukončovací operace můžou vyhodit vyjímku
v javě tohle platí dvojnásob, tady vyhazuje vyjímku i blbí uspání vlákna..
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Zachytenie výnimky JOptionPane — založil Anonym
C# odchytenie vynimky chybajucej assembly — založil puma
Prečo sa to vypína? — založil delphak
Kedy vykĺzne Windows 7 — založil Anonymní uživatel
Kedy pouzit unique_ptr — založil Rtt
Moderátoři diskuze