Rozdiel medzi hodmi a hodmi v Jave

1. Úvod

V tomto výučbe sa pozrieme na hodiť a hodí v Jave. Vysvetlíme, kedy by sme mali použiť každú z nich.

Ďalej si ukážeme niekoľko príkladov ich základného použitia.

2. Hoď a Vrhá

Začnime krátkym úvodom. Tieto kľúčové slová súvisia so spracovaním výnimiek. Výnimky sa vyskytujú, keď je narušený normálny tok našej aplikácie.

Dôvodov môže byť veľa. Používateľ mohol odoslať nesprávne vstupné údaje. Môžeme stratiť spojenie alebo môže dôjsť k inej neočakávanej situácii. Správne zaobchádzanie s výnimkami je kľúčom k tomu, aby naša aplikácia fungovala aj po objavení sa týchto nepríjemných momentov.

Používame hodiť kľúčové slovo výslovne vyvolať výnimku z kódu. Môže to byť akákoľvek metóda alebo statický blok. Táto výnimka musí byť podtriedou Hoditeľné. Môže to byť tiež a Hoditeľné sám. Nemôžeme hádzať viac výnimiek pomocou jedinej hodiť.

Vrhá kľúčové slovo je možné vložiť do deklarácie metódy. Označuje, ktoré výnimky je možné z tejto metódy vyvolať. Tieto výnimky musíme zvládnuť pomocou try-catch.

Tieto dve kľúčové slová nie sú zameniteľné!

3. Hoď v Jave

Pozrime sa na základný príklad s vylúčením výnimky z metódy.

Najskôr si predstavte, že píšeme jednoduchú kalkulačku. Jednou zo základných aritmetických operácií je delenie. Z tohto dôvodu sme boli požiadaní, aby sme implementovali túto funkciu:

verejné dvojité rozdelenie (dvojité a, dvojité b) {návrat a / b; }

Pretože nemôžeme deliť nulou, musíme do nášho existujúceho kódu pridať nejaké úpravy. Zdá sa, že je to vhodný okamih na nastolenie výnimky.

Poďme to spraviť:

verejné dvojité rozdelenie (dvojité a, dvojité b) {if (b == 0) {hodiť novú ArithmeticException ("Oddeľovač sa nemôže rovnať nule!"); } návrat a / b; }

Ako vidíte, použili sme Aritmetická výnimka s dokonale vyhovuje našim potrebám. Môžeme zložiť jeden String parameter konštruktora, ktorým je správa o výnimke.

3.1. Osvedčené postupy

Mali by sme vždy uprednostňovať najšpecifickejšiu výnimku. Musíme nájsť triedu, ktorá najlepšie vyhovuje našej výnimočnej udalosti. Napríklad hod NumberFormatException namiesto IllegalArgumentException. Mali by sme sa vyhnúť hádzaniu nešpecifikovaných Výnimka.

Napríklad existuje Celé číslo trieda v java.lang balíček. Pozrime sa na jedno z vyhlásení továrenskej metódy:

verejné statické celé číslo valueOf (String s) vyvolá NumberFormatException 

Je to statická továrenská metóda, ktorá vytvára Celé číslo príklad z String. V prípade nesprávneho zadania String, metóda hodí NumberFormatException.

Dobrým nápadom je definovať si našu vlastnú popisnejšiu výnimku. V našom Kalkulačka triedy, ktoré by mohli byť napr DivideByZeroException.

Pozrime sa na ukážkovú implementáciu:

public class DivideByZeroException rozširuje RuntimeException {public DivideByZeroException (reťazcová správa) {super (správa); }}

3.2. Zabalenie existujúcej výnimky

Niekedy chceme zabaliť existujúcu výnimku do nami definovanej.

Začnime definovaním vlastnej výnimky:

public class DataAcessException extends RuntimeException {public DataAcessException (String message, Throwable cause) {super (message, Cause); }}

Konštruktor má dva parametre: správu o výnimke a príčinu, ktorou môže byť ľubovoľná podtrieda Hoditeľné.

Napíšeme falošnú implementáciu pre findAll () funkcia:

public List findAll () hodí SQLException {hodiť novú SQLException (); }

Teraz v SimpleService nazvime funkciu úložiska, ktorej výsledkom môže byť Výnimka SQLE:

public void wrappingException () {try {personRepository.findAll (); } catch (SQLException e) {throw new DataAccessException ("SQL Exception", e); }}

Prehadzujeme znova SQLException zabalené do našej vlastnej výnimky s názvom DataAccessException. Všetko je overené nasledujúcim testom:

@Test void whenSQLExceptionIsThrown_thenShouldBeRethrownWithWrappedException () {assertThrows (DataAccessException.class, () -> simpleService.wrappingException ()); }

Sú na to dva dôvody. V prvom rade používame zalamovanie výnimiek, pretože zvyšok kódu nemusí vedieť o každej možnej výnimke v systéme.

Komponenty vyššej úrovne tiež nemusia vedieť o komponentoch spodnej úrovne, ani o výnimkách, ktoré používajú.

3.3. Multi-Catch s Java

Metódy, ktoré používame, môžu niekedy spôsobiť veľa rôznych výnimiek.

Pozrime sa na rozsiahlejší blok try-catch:

try {tryCatch.execute (); } catch (ConnectionException | SocketException ex) {System.out.println ("IOException"); } catch (Exception ex) {System.out.println ("Všeobecná výnimka"); }

The vykonať metóda môže spôsobiť tri výnimky: SocketException, ConnectionException, Exception. Prvý úlovkový blok sa chytí ConnectionException alebo SocketException. Druhý úlovok by sa chytil Výnimka alebo akákoľvek iná podtrieda Výnimka. Zapamätaj si to vždy by sme mali najskôr chytiť podrobnejšiu výnimku.

Poradie našich blokov úlovkov môžeme zameniť. Potom by sme nikdy nechytili SocketException a ConnectionException pretože všetko pôjde do úlovku s Výnimka.

4. Vrhá v Jave

Pridáme hodí k deklarácii metódy.

Pozrime sa na jednu z našich predchádzajúcich deklarácií metód:

public static void execute () vyvolá SocketException, ConnectionException, Exception

Metóda môže spôsobiť niekoľko výnimiek. Na konci deklarácie metódy sú oddelené čiarkou. Do súboru môžeme vložiť začiarknuté aj nezaškrtnuté výnimky hodí. Rozdiel medzi nimi sme opísali nižšie.

4.1. Začiarknuté a nezaškrtnuté výnimky

Zaškrtnutá výnimka znamená, že sa skontroluje v čase kompilácie. Upozorňujeme, že túto výnimku musíme zvládnuť. V opačnom prípade musí metóda určiť výnimku pomocou hodí kľúčové slovo.

Najčastejšie kontrolované výnimky sú IOException, FileNotFoundException, ParseException. FileNotFoundException sa môže hodiť, keď tvoríme FileInputStream od Súbor.

Existuje krátky príklad:

Súbor file = nový súbor ("not_existing_file.txt"); vyskúšajte {FileInputStream stream = nový FileInputStream (súbor); } catch (FileNotFoundException e) {e.printStackTrace (); }

Používaniu bloku try-catch sa môžeme vyhnúť pridaním hodí k deklarácii metódy:

private static void nezaškrtnutéException () hodí FileNotFoundException {File file = new File ("not_existing_file.txt"); Stream FileInputStream = nový FileInputStream (súbor); }

Funkcia vyššej úrovne musí túto výnimku bohužiaľ zvládnuť. Inak musíme túto výnimku vložiť do deklarácie metódy pomocou hodí kľúčové slovo.

Naopak, nekontrolované výnimky sa v čase kompilácie nekontrolujú.

Najbežnejšie nekontrolované výnimky sú: ArrayIndexOutOfBoundsException, IllegalArgumentException, NullPointerException.

Nezačiarknuté výnimky sa vyhodia počas behu programu. Nasledujúci kód vyvolá a NullPointerException. Pravdepodobne je to jedna z najbežnejších výnimiek v Jave.

Volanie metódy na nulovú referenciu bude mať za následok túto výnimku:

public void runtimeNullPointerException () {Reťazec a = null; a.length (); }

Overme toto správanie v teste:

@Test void whenCalled_thenNullPointerExceptionIsThrown () {assertThrows (NullPointerException.class, () -> simpleService.runtimeNullPointerException ()); }

Pamätajte, že tento kód a test nemá žiadny zmysel. Výnimky za behu sú vysvetlené iba na účely učenia.

V Jave každá podtrieda Chyba a RuntimeException je nekontrolovaná výnimka. Kontrolovanou výnimkou je všetko ostatné pod Hoditeľné trieda.

5. Záver

V tomto článku sme diskutovali o rozdiele medzi dvoma kľúčovými slovami Java: hodiť a hodí. Prešli sme základným používaním a trochu sme hovorili o osvedčených postupoch. Potom sme hovorili o kontrolovaných a nekontrolovaných výnimkách.

Ako vždy, zdrojový kód nájdete na našom GitHub.

Ak sa chcete podrobnejšie zaoberať spracovaním výnimiek v Jave, pozrite si náš článok o výnimkách v Jave.


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