Jak správně zacházet s výjimkami Javy

Jak správně zacházet s výjimkami Javy

Jako nováček v programování koncept zpracování výjimek zabalit si hlavu může být těžké. Ne, že by samotný koncept byl obtížný, ale terminologie může působit pokročileji, než je. A je to tak silná funkce, že je náchylné ke zneužití a zneužití.





V tomto článku se dozvíte, co jsou výjimky, proč jsou důležité, jak je používat a jak se vyvarovat běžných chyb. Většina moderních jazyků má nějaký způsob zpracování výjimek, takže pokud někdy přejdete z Javy, můžete si většinu těchto tipů vzít s sebou.





Pochopení výjimek jazyka Java

V Javě, výjimka je objekt, který naznačuje, že během běhu vaší aplikace došlo k něčemu neobvyklému (nebo „výjimečnému“). Takové výjimky jsou hozen , což v zásadě znamená, že je vytvořen objekt výjimky (podobně jako jsou chyby vyvolány).





Krása je, že můžete úlovek hozené výjimky, které vám umožní vypořádat se s abnormálním stavem a umožnit vaší aplikaci pokračovat v běhu, jako by se nic nestalo. Zatímco například nulový ukazatel v jazyce C může způsobit selhání vaší aplikace, Java vám umožní házet a chytat

NullPointerException

s before null variable has an chance to cause a crash.



Pamatujte, že výjimka je jen objekt, ale s jednou důležitou charakteristikou: musí být rozšířena z

Exception

třídy nebo jakékoli podtřídy





Exception

. Zatímco Java má všechny druhy vestavěných výjimek, můžete si také vytvořit vlastní, pokud si přejete. Některé z nejběžnější výjimky Java zahrnout:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Co se tedy stane, když vyvoláte výjimku?





Nejprve se Java podívá do bezprostřední metody, aby zjistila, zda existuje kód, který zpracovává druh výjimky, kterou jste vyvolali. Pokud obslužná rutina neexistuje, podívá se na metodu, která volala aktuální metodu, aby zjistila, zda tam existuje popisovač. Pokud ne, podívá se na metodu, která volala že metoda, a pak další metoda atd. Pokud výjimka není chycena, aplikace vytiskne trasování zásobníku a poté dojde k chybě. (Ve skutečnosti je to jemnější než pouhé shazování, ale to je pokročilé téma mimo rozsah tohoto článku.)

NA trasování zásobníku je seznam všech metod, které Java prošla při hledání obsluhy výjimek. Takto vypadá trasování zásobníku:

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)

Můžeme z toho hodně nasbírat. Nejprve byla vyvolána výjimka a

NullPointerException

. Došlo k tomu v

getTitle()

metoda na řádku 16 Book.java. Tato metoda byla volána z

getBookTitles()

na řádku 25 Author.java. Že metoda byla volána z

main()

na řádku 14 souboru Bootstrap.java. Jak vidíte, znalost toho všeho usnadňuje ladění.

Ale opět, skutečnou výhodou výjimek je, že můžete „zvládnout“ abnormální stav tím, že zachytíte výjimku, nastavíte věci správně a obnovíte aplikaci, aniž byste narazili.

Použití výjimek Java v kódu

Řekněme, že máte

someMethod()

to vezme celé číslo a provede nějakou logiku, která by se mohla zlomit, pokud je celé číslo menší než 0 nebo větší než 100. To by mohlo být dobré místo pro vyvolání výjimky:

pomocí ovladače wii u pro na počítači
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Abyste zachytili tuto výjimku, musíte jít kam

someMethod()

se nazývá a používá try-catch block :

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

Všechno uvnitř Snaž se blok se spustí v pořadí, dokud nebude vyvolána výjimka. Jakmile je vyvolána výjimka, všechny následující příkazy jsou přeskočeny a logika aplikace okamžitě přeskočí na úlovek blok.

V našem případě zadáme blok try a okamžitě zavoláme

someMethod()

. Protože 200 není mezi 0 a 100, an

IllegalArgumentException

je vyhozeno. Tím se okamžitě ukončí provádění

someMethod()

, přeskočí zbytek logiky v bloku try (

someOtherMethod()

není nikdy volán) a pokračuje v provádění v rámci catch bloku.

Co by se stalo, kdybychom zavolali

someMethod(50)

namísto? The

IllegalArgumentException

by nikdy nebyl vyhozen.

someMethod()

bude fungovat jako obvykle. Blok try by fungoval jako obvykle, volání

someOtherMethod()

když someMethod () dokončí. Když

someOtherMethod()

končí, blok chycení by byl přeskočen a

callingMethod()

by pokračoval.

Na jeden try blok můžete mít více bloků catch:

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

Všimněte si také, že volitelně Konečně blok také existuje:

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

Kód v bloku finally je vždy popraven bez ohledu na to. Pokud máte příkaz try v bloku try, blok finally se provede před návratem z metody. Pokud v bloku catch vyvoláte další výjimku, blok nakonec se provede před vyvoláním výjimky.

Blok finally byste měli použít, pokud máte objekty, které je třeba vyčistit, než metoda skončí. Pokud například otevřete soubor v bloku try a později vyvoláte výjimku, blok finally vám umožní zavřít soubor před opuštěním metody.

Všimněte si toho, že můžete mít konečně blok bez bloku catch:

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

To vám umožní provést potřebné vyčištění a současně umožnit vyvolaným výjimkám šířit zásobník vyvolání metody (tj. Nechcete zde zpracovávat výjimku, ale stále musíte nejprve vyčistit).

Zaškrtnuté vs. nezaškrtnuté výjimky v Javě

Na rozdíl od většiny jazyků Java rozlišuje mezi zkontrolovány výjimky a nekontrolované výjimky (např. C# má pouze nezaškrtnuté výjimky). Zkontrolovaná výjimka musí být chycen v metodě, kde je vyvolána výjimka, jinak kód nebude kompilován.

Chcete -li vytvořit zaškrtnutou výjimku, rozšiřte z

Exception

. Chcete -li vytvořit nekontrolovanou výjimku, rozšiřte z

RuntimeException

.

Jakákoli metoda, která vyvolá zaškrtnutou výjimku, to musí označit v podpisu metody pomocí hází klíčové slovo. Od vestavěné Javy

IOException

je zaškrtnutá výjimka, následující kód nebude kompilován:

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

Nejprve musíte prohlásit, že vyvolá zaškrtnutou výjimku:

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

Všimněte si, že metodu lze deklarovat jako vyvolání výjimky, ale ve skutečnosti nikdy výjimku nevyhodí. I tak bude třeba výjimku zachytit, jinak nebude kód kompilován.

Kdy byste měli použít zaškrtnuté nebo nezaškrtnuté výjimky?

Oficiální dokumentace Java má a stránku na tuto otázku . Rozdíl shrnuje stručným pravidlem: „Pokud lze od klienta rozumně očekávat, že se z výjimky vzpamatuje, udělejte z ní zaškrtnutou výjimku. Pokud klient nemůže pro zotavení z výjimky udělat nic, udělejte z něj nekontrolovanou výjimku. '

Ale tato směrnice může být zastaralá. Na jedné straně mají kontrolované výjimky za následek robustnější kód. Na druhou stranu žádný jiný jazyk nekontroloval výjimky stejným způsobem jako Java, což ukazuje dvě věci: jedna, tato funkce není dostatečně užitečná pro to, aby ji jiné jazyky ukradly, a za druhé, můžete bez nich absolutně žít. Zkontrolované výjimky navíc nehrají dobře s výrazy lambda zavedenými v Javě 8.

Pokyny pro použití výjimek Java

Výjimky jsou užitečné, ale lze je snadno zneužít a zneužít. Zde je několik tipů a osvědčených postupů, které vám pomohou vyhnout se nepořádku.

  • Upřednostňujte konkrétní výjimky před obecnými výjimkami. Použijte | _+_ | přes | _+_ | pokud je to možné, jinak použijte | _+_ | přes | _+_ | Pokud to bude možné.
  • Nikdy nechytit | _+_ | ! | _+_ | třída se ve skutečnosti rozšiřuje | _+_ | , a blok catch skutečně funguje s | _+_ | nebo jakákoli třída, která rozšiřuje Throwable. Nicméně | _+_ | třída se také rozšiřuje | _+_ | , a nikdy nechcete chytit | _+_ | protože | _+_ | s označují závažné neopravitelné problémy.
  • Nikdy nechytit | _+_ | ! | _+_ | prodlužuje | _+_ | , takže každý blok, který chytí | _+_ | také chytí | _+_ | , a to je velmi důležitá výjimka, se kterou si nechcete zahrávat (zvláště u aplikací s více vlákny), pokud nevíte, co děláte. Pokud nevíte, kterou výjimku místo toho chytit, zvažte, že nic nechytíte.
  • K usnadnění ladění použijte popisné zprávy. Když vyvoláte výjimku, můžete zadat | _+_ | zpráva jako argument. K této zprávě lze přistupovat v bloku catch pomocí | _+_ | metoda, ale pokud výjimka není nikdy chycena, zpráva se také zobrazí jako součást trasování zásobníku.
  • Snažte se nechytit a ignorovat výjimky. Aby se obešlo nepohodlí s kontrolovanými výjimkami, spousta nováčků a líných programátorů nastaví blok catch, ale ponechá ho prázdný. Špatný! Vždy s tím zacházejte ladně, ale pokud to nemůžete, přinejmenším si vytiskněte trasování zásobníku, abyste věděli, že byla vyvolána výjimka. To lze provést pomocí | _+_ | metoda.
  • Pozor na nadužívání výjimek. Když máte kladivo, všechno vypadá jako hřebík. Když se poprvé dozvíte o výjimkách, můžete se cítit povinni změnit vše na výjimku ... do bodu, kdy většina toku řízení vaší aplikace přijde na zpracování výjimek. Pamatujte, že výjimky jsou určeny pro „výjimečné“ události!

Nyní byste měli být dostatečně pohodlní s výjimkami, abyste pochopili, co jsou, proč se používají a jak je začlenit do vlastního kódu. Pokud tomuto konceptu plně nerozumíte, je to v pořádku! Chvíli mi trvalo, než mi to v hlavě ‚zacvaklo‘, takže nemáte pocit, že byste to museli uspěchat. Nepospíchej.

Máte nějaké dotazy? Znáte další tipy týkající se výjimek, které jsem zmeškal? Podělte se o ně v níže uvedených komentářích!

Podíl Podíl tweet E-mailem Jak vytvořit diagram toku dat pro vizualizaci dat jakéhokoli projektu

Diagramy toku dat (DFD) jakéhokoli procesu vám pomohou pochopit, jak data proudí ze zdroje do cíle. Zde je návod, jak jej vytvořit!

Číst dále
Související témata
  • Programování
  • Jáva
O autorovi Joel lee(1524 publikovaných článků)

Joel Lee je šéfredaktorem MakeUseOf od roku 2018. Má titul B.S. v informatice a více než devět let profesionálních zkušeností s psaním a střihem.

iPhone uvízl na logu Apple iOS 10
Více od Joela Leeho

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru