Bežné Java výnimky

1. Úvod

Tento výukový program sa zameriava na niektoré bežné výnimky Java.

Začneme diskusiou o tom, čo je v podstate výnimka. Neskôr si podrobne rozoberieme rôzne typy kontrolovaných a nekontrolovaných výnimiek.

2. Výnimky

Výnimkou je abnormálny stav, ktorý sa vyskytuje v postupnosti kódu počas vykonávania programu. Tento abnormálny stav nastáva, keď program za behu programu porušuje určité obmedzenia.

Všetky typy výnimiek sú podtriedami triedy Výnimka. Táto trieda sa potom podtriedi do začiarknutých a nezaškrtnutých výnimiek. V nasledujúcich častiach ich podrobne zvážime.

3. Začiarknuté výnimky

Zaškrtnuté výnimky sú povinné. Sú to priame podtriedy triedy Výnimka.

O ich dôležitosti sa vedie debata, ktorá stojí za to sa pozrieť.

Poďme si podrobne definovať niektoré zaškrtnuté výnimky.

3.1. Výnimka IO

Metóda hádže Výnimka IO alebo jeho priama podtrieda, keď ktorákoľvek operácia vstupu / výstupu zlyhá.

Medzi typické použitia týchto I / O operácií patria:

  • Práca so súborovým systémom alebo dátovými tokmi pomocou java.io balíček
  • Vytváranie sieťových aplikácií pomocou java.net balíček

FileNotFoundException

FileNotFoundException je bežný typ Výnimka IO pri práci so súborovým systémom:

skúsiť {nový FileReader (nový súbor ("/ neplatný / súbor / umiestnenie")); } catch (FileNotFoundException e) {LOGGER.info ("FileNotFoundException prichytený!"); }

MalformedURLE výnimka

Pri práci s adresami URL sa môžeme stretnúť s MalformedURLException - ak sú naše adresy URL neplatné.

skúsiť {new URL ("malformedurl"); } catch (MalformedURLException e) {LOGGER.error ("MalformedURLException chytený!"); }

3.2. ParseException

Java používa syntaktickú analýzu textu na vytvorenie objektu založeného na danom String.Ak syntaktická analýza spôsobí chybu, hodí a ParseException.

Napríklad by sme mohli zastupovať Dátum rôznymi spôsobmi napr. dd / mm / rrrr alebo dd, mm, rrrr, ale skús rozobrať a povrázok v inom formáte:

try {new SimpleDateFormat ("MM, dd, yyyy"). parse ("invalid-date"); } catch (ParseException e) {LOGGER.error ("ParseException chytený!"); }

Tu je String je zdeformovaný a spôsobuje a ParseException.

3.3. Prerušená výnimka

Kedykoľvek zavolá vlákno Java pripojiť sa (), spánok () alebo počkaj () ide do buď ČAKANIE štát alebo TIMED_WAITING štát.

Vlákno môže navyše prerušiť iné vlákno vyvolaním iného vlákna prerušiť() metóda.

V dôsledku toho the závit hodí Prerušená výnimka ak ho iné vlákno preruší, kým je v ČAKANIE alebo v TIMED_WAITING štát.

Zvážte nasledujúci príklad s dvoma vláknami:

  • Hlavné vlákno spustí podradené vlákno a preruší ho
  • Podradené vlákno sa spustí a zavolá spánok ()

Výsledkom tohto scenára je Prerušená výnimka:

trieda ChildThread rozširuje vlákno {public void run () {try {Thread.sleep (1000); } catch (InterruptedException e) {LOGGER.error ("InterruptedException chytený!"); }}} public class MainThread {public static void main (String [] args) throws InterruptedException {ChildThread childThread = new ChildThread (); childThread.start (); childThread.interrupt (); }}

4. Nezačiarknuté výnimky

Pre nekontrolované výnimky kompilátor počas procesu kompilácie nekontroluje. Preto nie je povinné, aby metóda tieto výnimky spracovala.

Všetky nezaškrtnuté výnimky rozširujú triedu RuntimeException.

Poďme si podrobne rozobrať niektoré nekontrolované výnimky.

4.1. NullPointerException

Ak sa aplikácia pokúsi použiť nulový tam, kde to v skutočnosti vyžaduje inštanciu objektu, metóda vyvolá a NullPointerException.

Existujú rôzne scenáre, v ktorých sa nelegálne použitie nulový príčiny NullPointerException. Zvážme niektoré z nich.

Volanie metódy triedy, ktorá nemá inštanciu objektu:

Reťazec strObj = null; strObj.equals ("Hello World"); // hodí NullPointerException.

Tiež, ak sa aplikácia pokúsi získať prístup alebo upraviť premennú inštancie pomocou a nulový referencia, dostaneme a NullPointerException:

Osoba personObj = null; Názov reťazca = personObj.personName; // Prístup do poľa prázdneho objektu personObj.personName = "Jon Doe"; // Úprava poľa prázdneho objektu

4.2. ArrayIndexOutOfBoundsException

Pole ukladá svoje prvky súvislým spôsobom. K jeho prvkom teda môžeme pristupovať prostredníctvom indexov.

Avšak, ak sa kúsok kódu pokúsi získať prístup k nelegálnemu indexu poľa, príslušná metóda hodí znak ArrayIndexOutOfBoundException.

Pozrime sa na niekoľko príkladov, ktoré hodia ArrayIndexOutOfBoundException:

int [] nums = new int [] {1, 2, 3}; int numFromNegativeIndex = čísla [-1]; // Pokus o prístup na negatívny index int numFromGreaterIndex = nums [4]; // Pokus o prístup pri väčšom indexe int numFromLengthIndex = nums [3]; // Pokúšam sa získať prístup k indexu rovnajúcemu sa veľkosti poľa

4.3. StringIndexOutOfBoundsException

The String Trieda v Jave poskytuje metódy na prístup ku konkrétnemu znaku reťazca alebo na rozdelenie poľa znakov z poľa String. Keď použijeme tieto metódy, interne prevedie String do znakového poľa.

Opäť môže dôjsť k nelegálnemu použitiu indexov na tomto poli. V takýchto prípadoch sa tieto metódy String trieda hodí StringIndexOutOfBoundsException.

Táto výnimka označuje, že index je väčší alebo rovnaký ako veľkosť indexu String.StringIndexOutOfBoundsException predlžuje IndexOutOfBoundsException.

Metóda charAt (index) triedy String vyvolá túto výnimku, keď sa pokúsime získať znak v indexe rovnom Reťazec dĺžka alebo iný nelegálny index:

String str = "Hello World"; char charAtNegativeIndex = str.charAt (-1); // Pokus o prístup na záporný index char charAtLengthIndex = str.charAt (11); // Pokúšam sa získať prístup k indexu rovnému veľkosti reťazca 

4.4. NumberFormatException

Aplikácia často končí číselnými údajmi v a String. Aby bolo možné tieto údaje interpretovať ako číselné, Java umožňuje konverziu z String na numerické typy. Obalové triedy ako napr Celé číslo, plavák atď. obsahuje úžitkové metódy na tento účel.

Avšak ak String počas konverzie nemá vhodný formát, metóda hodí a NumberFormatException.

Uvažujme o nasledujúcom úryvku.

Tu deklarujeme a String s alfanumerickými údajmi. Ďalej sa snažíme používať metódy Celé číslo súhrnná trieda na interpretáciu týchto údajov ako číselných.

Výsledkom toho je NumberFormatException:

Reťazec str = "100ABCD"; int x = Integer.parseInt (str); // Hodí NumberFormatException int y = Integer.valueOf (str); // Vyhodí NumberFormatException

4.5. Aritmetická výnimka

Keď program vyhodnotí aritmetickú operáciu a výsledkom bude nejaký výnimočný stav, vyhodí sa Aritmetická výnimka. Navyše, Aritmetická výnimka platí iba pre int a dlho dátové typy.

Napríklad, ak sa pokúsime vydeliť celé číslo nulou, dostaneme Aritmetická výnimka:

int legalOperation = 30/0; // Vyhodí aritmetickú výnimku

4.6. ClassCastException

Java umožňuje obsadenie medzi objektmi s cieľom podporiť dedičnosť a polymorfizmus. Objekt môžeme buď postaviť hore alebo dole.

Pri vyraďovaní vrháme objekt do jeho supertypu. A pri downcastingu vrháme objekt na jeden z jeho podtypov.

Avšak za behu, ak sa kód pokúsi downcastovať objekt na podtyp, ktorého nie je inštanciou, metóda hodí ClassCastException.

Pri typovom obsadení je skutočne dôležitá inštancia runtime. Zvážte nasledujúce dedičstvo medzi Zviera, Pes a lev:

trieda Zviera {} trieda Pes rozširuje Zviera {} trieda Lev rozširuje Zviera {} 

Ďalej sme v triede vodičov obsadili Zviera odkaz obsahujúci inštanciu Lev do a pes.

Avšak za behu si JVM všimne túto inštanciu Lev nie je kompatibilný s podtypom triedy pes.

Výsledkom je ClassCastException:

Zvieracie zviera = nový lev (); // Za behu je inštancia Lion Dog tommy = (Dog) animal; // Vyhodí ClassCastException

4.7. IllegalArgumentException

Metóda hádže IllegalArgumentException ak to nazveme nejakými nelegálnymi alebo nevhodnými argumentmi.

Napríklad spánok () metóda Závit trieda očakáva kladný čas a ako argument odovzdáme záporný časový interval. Výsledkom je IllegalArgumentException:

Thread.currentThread (). Spánok (-10 000); // Vyhodí IllegalArgumentException

4.8. IllegalStateException

IllegalStateException signalizuje, že metóda bola vyvolaná v nezákonnom alebo nevhodnom čase.

Každý objekt Java má stav (premenné inštancie) a určité správanie (metódy). Teda IllegalStateException znamená, že je nezákonné vyvolať správanie tohto objektu s aktuálnymi stavovými premennými.

S niektorými rôznymi stavovými premennými by to však mohlo byť legálne.

Napríklad na iteráciu zoznamu používame iterátor. Kedykoľvek jeden inicializujeme, interne nastaví jeho stavovú premennú lastRet až -1.

V tejto súvislosti sa program pokúša nazvať odstrániť metóda na zozname:

// Inicializované indexom na -1 Iterator intListIterator = new ArrayList (). Iterator (); intListIterator.remove (); // IllegalStateException 

Vnútorne odstrániť metóda kontroluje stavovú premennú lastRet a ak je menej ako 0, hodí IllegalStateException. Tu premenná stále smeruje k hodnote -1.

Vo výsledku dostaneme IllegalStateException.

5. Záver

V tomto článku sme si najskôr povedali, čo sú výnimky. An výnimkou je udalosť, ku ktorej dôjde počas vykonávania programu a ktorá naruší normálny priebeh pokynov programu.

Potom sme kategorizovali výnimky na Kontrolované výnimky a Nekontrolované výnimky.

Ďalej sme diskutovali o rôznych druhoch výnimiek, ktoré sa môžu vyskytnúť počas kompilácie alebo za behu programu.

Kód tohto článku nájdeme na stránkach GitHub.


$config[zx-auto] not found$config[zx-overlay] not found