Ako zaobchádzať s výnimkami Java správnym spôsobom

Ako zaobchádzať s výnimkami Java správnym spôsobom

Ako nováčik v programovaní je koncept spracovanie výnimiek Omotať hlavu môže byť náročné. Niežeby bol samotný koncept náročný, ale podľa terminológie sa môže zdať vyspelejší, ako je. A je to taká silná funkcia, že je náchylné na nesprávne používanie a zneužívanie.





V tomto článku sa dozviete, čo sú výnimky, prečo sú dôležité, ako ich používať a ktorým chybám sa treba vyhnúť. Väčšina moderných jazykov má nejaký spôsob spracovania výnimiek, takže ak niekedy prejdete z Javy, väčšinu týchto tipov si môžete vziať so sebou.





Pochopenie výnimiek Java

V jazyku Java, výnimka je objekt, ktorý naznačuje, že počas chodu vašej aplikácie došlo k niečomu neobvyklému (alebo „výnimočnému“). Takými výnimkami sú hodený , čo v zásade znamená, že sa vytvorí objekt výnimky (podobne ako sa „vyvolávajú chyby“).





Krása je, že môžete chytiť vyvolané výnimky, ktoré vám umožňujú vyrovnať sa s abnormálnym stavom a nechať vašu aplikáciu pokračovať v prevádzke, ako keby sa nič nestalo. Zatiaľ čo napríklad nulový ukazovateľ v jazyku C môže spôsobiť zlyhanie vašej aplikácie, Java vám umožňuje hádzať a chytať

NullPointerException

s skôr, ako má nulová premenná šancu spôsobiť zlyhanie.



Pamätajte si, že výnimka je len objekt, ale s jednou dôležitou vlastnosťou: musí byť rozšírená z

Exception

triedy alebo akejkoľvek podtriedy





Exception

. Aj keď má Java všetky druhy vstavaných výnimiek, môžete si vytvoriť aj svoje vlastné, ak si budete priať. Niektoré z najbežnejšie výnimky Java patrí:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Čo sa teda stane, keď vyvoláte výnimku?





Java najskôr hľadá okamžitú metódu, aby zistila, či existuje kód, ktorý zvládne typ výnimky, ktorú ste uviedli. Ak handler neexistuje, pozrie sa na metódu, ktorá zavolala aktuálnu metódu, a zistí, či tam nejaký popisovač existuje. Ak nie, pozerá sa na metódu, ktorá zavolala že metóda, a potom ďalšia metóda atď. Ak výnimka nie je zachytená, aplikácia vytlačí trasovanie zásobníka a potom zlyhá. (V skutočnosti je to jemnejšie než len zrútenie, ale to je pokročilá téma presahujúca rámec tohto článku.)

TO trasovanie zásobníka je zoznam všetkých metód, ktorými Java prešla pri hľadaní obsluhy výnimiek. Takto vyzerá sledovanie zásobníka:

Exception in thread 'main' java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Z toho môžeme veľa čerpať. Po prvé, hodená výnimka bola a

NullPointerException

. Stalo sa to v

getTitle()

metóda na riadku 16 Book.java. Táto metóda bola zavolaná z

getBookTitles()

na riadku 25 súboru Author.java. To metóda bola volaná z

main()

na riadku 14 Bootstrap.java. Ako vidíte, vedieť to všetko uľahčuje ladenie.

Ale opäť, skutočnou výhodou výnimiek je, že môžete „zvládnuť“ abnormálny stav tak, že výnimku zachytíte, uvediete veci do poriadku a obnovíte aplikáciu bez toho, aby ste havarovali.

Použitie výnimiek Java v kóde

Povedzme, že máte

someMethod()

ktorý vezme celé číslo a vykoná nejakú logiku, ktorá by sa mohla zlomiť, ak je celé číslo menšie ako 0 alebo väčšie ako 100. To by mohlo byť dobré miesto na vyvolanie výnimky:

kde nájsť imei na iphone
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Aby ste zachytili túto výnimku, musíte ísť kam

someMethod()

sa volá a používa blok try-catch :

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}

Všetko v rámci skúsiť blok sa spustí v uvedenom poradí, pokiaľ nie je vyvolaná výnimka. Hneď ako sa vyskytne výnimka, všetky nasledujúce príkazy sa preskočia a aplikačná logika okamžite skočí na chytiť blok.

V našom prípade zadáme blok try a okamžite zavoláme

someMethod()

. Pretože 200 nie je medzi 0 a 100, an

IllegalArgumentException

je hodený. Tým sa okamžite skončí poprava

someMethod()

, preskočí zvyšok logiky v bloku try (

someOtherMethod()

sa nikdy nevolá) a pokračuje v spustení v rámci bloku catch.

Čo by sa stalo, keby sme zavolali

someMethod(50)

namiesto toho? The

IllegalArgumentException

by nikdy nebol vyhodený.

someMethod()

bude fungovať ako obvykle. Blok try sa spustí ako obvykle, volá sa

someOtherMethod()

keď sa someMethod () dokončí. Kedy

someOtherMethod()

končí, blok chyty by bol preskočený a

callingMethod()

by pokračoval.

Na jeden blok pokusov môžete mať viacero blokov zachytenia:

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}

Upozorňujeme, že voliteľné konečne blok existuje tiež:

public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}

Kód v bloku nakoniec je vždy popravený bez ohľadu na to. Ak máte v bloku try príkaz return, blok finally sa vykoná pred návratom z metódy. Ak hodíte do bloku catch inú výnimku, blok nakoniec sa vykoná pred vyhodením výnimky.

Blok finally by ste mali použiť, ak máte objekty, ktoré je potrebné vyčistiť pred skončením metódy. Ak napríklad otvoríte súbor v bloku try a neskôr vyvoláte výnimku, blok nakoniec vám umožní zatvoriť súbor pred opustením metódy.

Všimnite si toho, že môžete mať konečne blok aj bez blokovania zachytávania:

public void method() {
try {
// ...
} finally {
// ...
}
}

To vám umožní vykonať potrebné vyčistenie a zároveň umožniť vyvolaným výnimkám propagovať zásobník vyvolávania metód (t. J. Nechcete tu zaobchádzať s výnimkou, ale stále musíte najskôr vyčistiť).

Začiarknuté vs. nezaškrtnuté výnimky v jazyku Java

Na rozdiel od väčšiny jazykov Java rozlišuje medzi skontrolované výnimky a nekontrolované výnimky (napr. C# má iba nekontrolované výnimky). Skontrolovaná výnimka musieť byť zachytený v metóde, kde je vyvolaná výnimka, inak sa kód neskompiluje.

Ak chcete vytvoriť začiarknutú výnimku, rozšírte súbor z

Exception

. Ak chcete vytvoriť nekontrolovanú výnimku, rozšírte z

RuntimeException

.

Akákoľvek metóda, ktorá vyvolá kontrolovanú výnimku, to musí označiť v podpise metódy pomocou hody kľúčové slovo. Od vstavanej Javy

IOException

je začiarknutá výnimka, nasledujúci kód sa neskompiluje:

public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Najprv musíte vyhlásiť, že vyvoláva začiarknutú výnimku:

public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Všimnite si toho, že metódu je možné deklarovať ako vyvolanie výnimky, ale v skutočnosti nikdy výnimku nevyhodiť. Aj napriek tomu bude treba výnimku zachytiť, inak sa kód neskompiluje.

Kedy by ste mali použiť začiarknuté alebo nezaškrtnuté výnimky?

Oficiálna dokumentácia Java má a stránka na túto otázku . Rozdiel je zhrnutý do stručného pravidla: „Ak sa dá od klienta rozumne očakávať, že sa z výnimky zotaví, urobte z nej kontrolovanú výnimku. Ak klient nemôže urobiť nič, aby sa z výnimky zotavil, urobte z nej nekontrolovanú výnimku. “

Toto usmernenie však môže byť zastarané. Skontrolované výnimky na jednej strane vedú k robustnejšiemu kódu. Na druhej strane žiadny iný jazyk nekontroloval výnimky rovnakým spôsobom ako Java, ktorý ukazuje dve veci: jednu, táto funkcia nie je dostatočne užitočná na to, aby ju ukradli ostatné jazyky, a za druhé, bez nich môžete úplne žiť. Skontrolované výnimky navyše nehrajú dobre s výrazmi lambda zavedenými v jazyku Java 8.

Pokyny pre používanie výnimiek Java

Výnimky sú užitočné, ale dajú sa ľahko zneužiť a zneužiť. Tu je pár tipov a osvedčených postupov, ktoré vám pomôžu vyhnúť sa neporiadku.

  • Uprednostňujte konkrétne výnimky pred všeobecnými výnimkami. Použite | _+_ | viac ako | _+_ | ak je to možné, v opačnom prípade použite | _+_ | viac ako | _+_ | keď je to možné.
  • Nikdy nechytajte | _+_ | ! | _+_ | trieda sa skutočne rozširuje | _+_ | , a blok catch skutočne funguje s | _+_ | alebo akákoľvek trieda, ktorá rozširuje Throwable. Avšak | _+_ | trieda sa tiež rozširuje | _+_ | , a nikdy nechcete chytiť | _+_ | pretože | _+_ | s označujú vážne neopraviteľné problémy.
  • Nikdy nechytajte | _+_ | ! | _+_ | predlžuje | _+_ | , takže každý blok, ktorý chytí | _+_ | chytí aj | _+_ | , a to je veľmi dôležitá výnimka, s ktorou si nechcete pohrávať (obzvlášť vo viacvláknových aplikáciách), pokiaľ neviete, čo robíte. Ak neviete, ktorú výnimku máte namiesto toho chytiť, zvážte, že ste nič nechytili.
  • Na uľahčenie ladenia použite popisné správy. Keď vyvoláte výnimku, môžete poskytnúť | _+_ | správa ako argument. K tejto správe sa dá dostať v bloku catch pomocou | _+_ | ale ak sa výnimka nikdy nezachytí, správa sa zobrazí aj ako súčasť sledovania zásobníka.
  • Skúste výnimky nechytať a ignorovať. Aby sa vyhli nepríjemnostiam s kontrolovanými výnimkami, veľa nováčikov a lenivých programátorov nastaví záchytný blok, ale ponechá ho prázdny. Zle! Vždy to zvládajte ladne, ale ak nemôžete, prinajmenšom vytlačte stopu stohu, aby ste vedeli, že došlo k výnimke. Môžete to urobiť pomocou | _+_ | metóda.
  • Dávajte si pozor na nadmerné používanie výnimiek. Keď máte kladivo, všetko vyzerá ako klinec. Keď sa prvýkrát dozviete o výnimkách, môžete sa cítiť povinní zmeniť všetko na výnimku ... až do bodu, kedy sa väčšina toku riadenia vašej aplikácie dostane k spracovaniu výnimiek. Nezabudnite, že výnimky sú určené pre „výnimočné“ udalosti!

Teraz by ste mali byť dostatočne pohodlní s výnimkami na to, aby ste pochopili, čo sú, prečo sa používajú a ako ich začleniť do vlastného kódu. Ak tomuto konceptu úplne nerozumiete, je to v poriadku! Chvíľu mi trvalo, kým mi to v hlave 'zacvaklo', takže nemáte pocit, že by ste to museli uponáhľať. Neponáhľaj sa.

Máte nejaké otázky? Viete o ďalších tipoch týkajúcich sa výnimiek, ktoré som zmeškal? Podeľte sa o ne v nižšie uvedených komentároch!

zdieľam zdieľam Tweet E -mail Ako vytvoriť diagram toku údajov na vizualizáciu údajov akéhokoľvek projektu

Diagramy toku údajov (DFD) akéhokoľvek procesu vám pomôžu pochopiť, ako údaje prúdia zo zdroja do cieľa. Takto ho vytvoríte!

Čítajte ďalej
Súvisiace témy
  • Programovanie
  • Java
O autorovi Joel Lee(1524 publikovaných článkov)

Joel Lee je šéfredaktorom MakeUseOf od roku 2018. Má titul B.S. v informatike a viac ako deväť rokov profesionálnych skúseností s písaním a úpravami.

požiadavka deskriptora zariadenia so systémom Windows 10 zlyhala
Viac od Joela Leeho

prihlásiť sa ku odberu noviniek

Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné elektronické knihy a exkluzívne ponuky!

Kliknutím sem sa prihlásite na odber