Reklama
Výnimka v programovaní znamená výnimočnú podmienku v určitom okamihu vykonávania programu. Používa sa, keď sa výnimočná podmienka dá lepšie zvládnuť kdekoľvek inde, než kde sa vyskytuje. Zvážte nasledujúce príklady:
- Neúspech pri otvorení konfiguračného súboru je možné lepšie vyriešiť vyššie v kóde, napríklad pomocou alternatívneho umiestnenia konfiguračného súboru.
- Prístup k položka poľa Ako používať Java ArrayListArraylist Java je pole na všeobecné použitie s možnosťou zmeny veľkosti. Poskytuje väčšinu zariadení všeobecne očakávaných od polí v iných jazykoch. V tomto článku sa dozviete, ako nastaviť a používať arraylist. Čítaj viac mimo hraníc poľa znamená chybu programu. Šťastné ladenie!
- Chyba analýzy XML by sa mala oznámiť užívateľovi, aby sa mohol súbor XML opraviť.
- Program, ktorý má nedostatok pamäte (možno pri spracovaní veľkého súboru), sa dá napraviť zvýšením množstva pamäte dostupnej pre proces java.
Vo všetkých týchto prípadoch (a viac) by sa výnimka mala riešiť mimo miesta, kde sa vygeneruje, aby sa dala riešiť základná príčina.
Typy výnimiek
Obrázok nižšie zobrazuje hlavné časti hierarchie výnimiek Java. Základná trieda je Throwable do ktorej je zaradená výnimka a Chyba. Trieda výnimka je pre podmienky súvisiace s programom, ktoré môžu aplikácie zachytiť v snahe zachrániť situáciu. Trieda Chyba, na druhej strane slúži na označenie závažných chýb v prostredí Java Run-time Environment, ktoré by aplikácie nemali zachytiť. Niektoré príklady sú: OutOfMemoryError a StackOverflowError.
výnimka opäť je dvoch typov: začiarknuté a nezaškrtnuté. Overenú výnimku musí spracovať volací kód. Toto pravidlo presadzuje kompilátor java. Naopak, nezaškrtnutá výnimka sa môže šíriť v telefónnom reťazci bez toho, aby sa musela výslovne uviesť. Nasledujúce príklady objasnia.
Začiarknuté výnimky
Nasledujúca metóda sa pokúša vytvoriť FileReader zo súboru. Konštruktor vyvolá zaškrtnutú výnimku FileNotFoundException ktoré musia byť spracované volacím kódom alebo vyhlásené za vyhodené.
Nasledujúci kód bude nie skompilovať, pretože nemá ani jednu.
private void loadFile (String filename) {FileReader in = new FileReader (filename); }
Jedným zo spôsobov, ako získať kompiláciu kódu, je zvládnuť výnimku (pozri nižšie).
private void loadFile (String filename) {try {FileReader in = new FileReader (filename)); {} catch (FileNotFoundException ex) {// handle handle here} }
Ak volajúci nemôže výnimku spracovať priamo, musí sa uviesť v podpise metódy.
private void loadFile (String filename) vyvolá java.io. FileNotFoundException. {FileReader in = new FileReader (filename)); { }
Nekontrolované výnimky
Nekontrolovaná výnimka je tá, ktorá je podtriedená z RuntimeException a nemusí sa s nimi manipulovať priamo ani sa neuvádzať vyššie. Napríklad nasledujúci kód vedie k a NullPointerException, čo je typ RuntimeException. Kód sa však od roku 2006 kompiluje bez chyby NullPointerException je nekontrolovaná výnimka.
súkromná neplatná handleEvent () {String name = null; if (name.length ()> 0) {} }
Výnimky zalamovania
Vzhľadom na vyššie uvedenú diskusiu o kontrolovaných a nekontrolovaných výnimkách sa zdá, že je ľahšie sa zaoberať nekontrolovanými výnimkami, pretože ich nemusíte deklarovať ani s nimi manipulovať sami. Z tohto dôvodu môže byť niekedy užitočné zaškrtnúť výnimku do nezaškrtnutej výnimky.
Nasledujúci príklad kódu ukazuje, ako zalomiť výnimku. Metóda method_1 () vyvolá SQLEXCEPTION vo svojom tele. Aby sa kód skompiloval správne, musí sa vyhlásiť výnimka za vyhodenú.
private void method_1 () vyvolá SQLException {... vrhnite novú SQLException; }
Keď je táto metóda vyvolaná z inej metódy (method_2 ()), táto metóda môže chytiť SQLEXCEPTION a zabaliť ho do nezaškrtnutej výnimky, takže nemusí deklarovať výnimku v podpise metódy.
private void method_2 () {try {method_1 (); } catch (java.sql. SQLException ex) {throw new RuntimeException (ex); } }
Stopa výnimiek zásobníka
Sledovanie výnimočných zásobníkov sa týka súboru aktívnych zásobníkových rámcov, z ktorých každý predstavuje vyvolanie metódy, zachytené JVM v čase, keď bola výnimka vyvolaná. Každý rámec zásobníka obsahuje umiestnenie vyvolania metódy vrátane názvu triedy, názvu metódy a prípadne názvu zdrojového súboru java a čísla riadku v súbore. Je to užitočné na spätné sledovanie sledu hovorov ktoré spôsobili chybu Výnimky v jazyku Java: Máte na ich riešenie pravdu?Výnimka v programovaní znamená výnimočnú podmienku vykonávania programu. Používa sa, keď sa dá stav lepšie zvládnuť kdekoľvek inde. Zvážte nasledujúce príklady spracovania výnimiek Java. Čítaj viac .
Toto je typická stopa zásobníka získaná z objektu výnimky, keď bol zachytený.
Výnimka v vlákne „main“ java.lang. IndexOutOfBoundsException: Index: 8, Size: 5 at java.util. ArrayList.rangeCheck (ArrayList.java: 653) na java.util. ArrayList.get (ArrayList.java: 429) na sample.sample1.main (sample1.java: 24)
Výnimkou je tu IndexOutOfBoundsException. Obsahuje ďalšie informácie o chybe. Sledovanie zásobníka obsahuje 3 rámce zásobníkov, z ktorých každý obsahuje informácie o polohe, ako je zobrazené.
Spracovanie výnimiek
Výnimku možno vyriešiť chytením do a Skús chytiť blokovanie a prijatie potrebných nápravných opatrení. výnimka Objekt poskytuje niekoľko metód na extrahovanie informácií o stave, ktorý ich spôsobil.
Nasledujúci kód zaznamená chybovú správu do súboru denníka.
private void loadConfig () {try {// vyvolať kód, ktorý by mohol generovať úlovok IOException} (java.io. IOException ex) {// tu spracovajte výnimku. Môže byť prihlásený do logovacieho súboru. log.warning (ex.getMessage ()); } }
Ak je výnimka zalomená vo vnútri iného, môžete získať zalomenú výnimku:
Hádzateľná príčina = ex.getCause (); log.warning („Základná príčina:“ + príčina.getMessage ());
Potrebujete prístup k trasovaniu zásobníka a prípadne môžete extrahovať názov metódy, ktorá ho spôsobila?
StringBuilder sbuf = new StringBuilder ("Stack Trace:"); pre (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());
Alebo možno prihlásite výnimku a znova ju odošlite?
skúste {... } úlovok (java.io. IOException ex) {log.warning (ex.getMessage ()); hodiť ex; }
výnimka trieda poskytuje printStackTrace () metóda, ktorá dokáže vytlačiť stopu zásobníka podľa vašich potrieb PrintStream (alebo PrintWriter).
skúste {... } úlovok (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }
Naraz môžete zachytiť niekoľko typov výnimiek vyskúšať blokovať a vykonávať špecifické zaobchádzanie pre každý typ výnimky.
skúste {// vyvolá tu niektoré výnimky. } úlovok (java.io. IOException ex) {// Tu sa zaoberá konkrétnym spracovaním IOException. } catch (java.sql. SQLException ex) {// Tu sa zaoberá špecifickým spracovaním SQLException. }
Ak chcete zachytiť viacero typov výnimiek, ale použiť rovnaký manipulačný kód, môžete deklarovať a úlovok blok s viacerými typmi:
skúste {// vyvolá tu niektoré výnimky. } úlovok (java.io. Výnimka java.sql. SQLException ex) {// Tu sú spracované špecifické úpravy IOException a SQLException. } catch (SAXException ex) {// SAXException špecifické zaobchádzanie tu. }
Nakoniec vyčistite zdroje
Pri práci s kódom, ktorý môže spôsobiť výnimky, je nevyhnutné riadne vyčistiť všetky zdroje, napríklad otvorené súbory Všetko, čo potrebujete vedieť o súborových formátoch a ich vlastnostiachPoužívame súbor slov zameniteľne: hudbu, obrázok, tabuľku, prezentáciu atď. Čo vlastne robí zo súboru „súbor“? Skúsme porozumieť tejto základnej časti výpočtovej techniky. Čítaj viac , pripojenie k databáze atď. Čistenie zdrojov by sa malo vykonať v a konečne blok. Týmto spôsobom vyvoláva normálny aj výnimočný výjazd z bloku čistiaci kód 10 najhorších chýb programovania v históriiVo svojej búrlivej minulosti kódovalo aj kované ničenie. Prípady zlého kódu spôsobili katastrofu na veľkej úrovni. Nasleduje 10 najhorších chýb programovania v histórii. Čítaj viac .
InputStream in = null; skúste {... in = new FileInputStream (filename);... } úlovok (java.io. IOException ex) {log.warning (ex.getMessage ()); } konečne {// kód sa tu vykoná pri ukončení výstupného bloku //, či už normálne alebo kvôli výnimke, ak (in! = null) in.close (); }
Blok vyskúšania zdrojov
Java 1.7 predstavil pokúsiť-s-zdrojov konštrukcia, ktorá uľahčuje čistenie zdrojov. Vyzerá to takto:
try (InputStream in = new FileInputStream (..)) {// kód, ktorý používa InputStream. }
Keď kód opustí blok (či už čisto alebo z dôvodu výnimky), InputStream premenná je automaticky vyčistená.
Vyčistite viac zdrojov vyhlásením všetkých z nich v hlave bloku.
try (InputStream in = new FileInputStream (..); Pripojenie con =...; ) {// kód, ktorý používa InputStream a pripojenie. }
Akýkoľvek objekt, ktorého trieda implementuje AutoCloseable rozhranie môže byť vyčistené týmto spôsobom. Nasledujúca trieda vykonáva určité špecifické čistenie v Zavrieť() metóda.
public class MyClass implementuje AutoCloseable {public void close () {// cleanup code here} }
Použite inštanciu tejto triedy v a pokúsiť-s-zdrojov blok.
try (MyClass obj = new MyClass (..)) {// kód, ktorý používa objekt MyClass. }
Niektoré bežne sa vyskytujúce výnimky
Pozrime sa teraz na niektoré bežne sa vyskytujúce výnimky.
- IndexOutOfBoundsException (nezaškrtnuté): znamená, že index prvku, ktorý je predmetom prístupu, je mimo hraníc poľa, reťazca, atď.
- SQLEXCEPTION (začiarknuté): vyvolané chybou databázy.
- IOException (skontrolované): chyba prístupu k súboru alebo chyby súvisiace so vstupom a výstupom.
- InterruptedException (začiarknuté): vyvolané pri prerušení spracovania vlákna.
- SAXException (začiarknuté): vyvolané kvôli chybám analýzy XML.
- NullPointerException (nezaškrtnuté): použitie null, ak sa vyžaduje objekt.
Zabalenie
Výnimky sú primárna metóda na hlásenie a správu chýb v Jave. Správne použitie výnimiek zvýšiť kvalitu kódu Rýchlejšie písanie alebo kódovanie v textovom editore Linuxu s vlastnými motívmiVáš textový editor pre Linux nemusí vyzerať falošne a „funkčne“. Prečo ho vylepšiť, aby ste zvýšili svoju produktivitu, či už skriptovanie a kódovanie alebo používanie nástroja ako editora značiek? Čítaj viac a pomôcť pri riešení problémov vo výrobe.
Máte nejaké vojnové príbehy, ktoré sa týkajú výnimiek? Ak áno, povedzte nám o tom v nižšie uvedenej časti s komentármi.
Obrázok Kredit: Dmitrij Nikolaev cez Shutterstock.com