V tomto tutoriále sa pomocou príkladov naučíme používať kľúčové slovo throw and throws na spracovanie výnimiek.
V prostredí Java možno výnimky rozdeliť do dvoch typov:
- Nekontrolované Výnimky: Oni nie sú kontrolované pri kompilácii-time, ale pri spustení time.For napríklad:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
výnimky v rámciError
triedy, atď - Skontrolované výnimky: Kontrolujú sa pri kompilácii. Napríklad
IOException
,InterruptedException
atď
V časti Výnimky jazyka Java sa dozviete podrobnejšie o kontrolovaných a nekontrolovaných výnimkách.
Zvyčajne nepotrebujeme riešiť nezaškrtnuté výnimky. Je to preto, lebo sa vyskytujú nekontrolované výnimky v dôsledku programovacích chýb. Je dobrým zvykom ich namiesto manipulácie opraviť.
Tento výukový program sa teraz zameria na to, ako zvládnuť skontrolované výnimky pomocou throw
a throws
.
Java hodí kľúčové slovo
throws
Kľúčové slovo v deklarácii metódy používame na deklarovanie typu výnimiek, ktoré sa v ňom môžu vyskytnúť.
Jeho syntax je:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Ako vidíte z vyššie uvedenej syntaxe, môžeme použiť throws
na vyhlásenie viacerých výnimiek.
Príklad 1: Java hodí kľúčové slovo
import java.io.*; class Main ( public static void findFile() throws IOException ( // code that may produce IOException File newFile=new File("test.txt"); FileInputStream stream=new FileInputStream(newFile); ) public static void main(String() args) ( try( findFile(); ) catch(IOException e)( System.out.println(e); ) ) )
Výkon
java.io.FileNotFoundException: test.txt (Žiadny takýto súbor alebo adresár)
Keď spustíme tento program, ak súbor test.txt
neexistuje, FileInputStream
hodí znak, FileNotFoundException
ktorý rozširuje IOException
triedu.
Ak metóda nespracúva výnimky, musí byť v throws
klauzule zadaný typ výnimiek, ktoré sa v nej môžu vyskytnúť , aby ich metódy ďalej v zásobníku hovorov mohli spracovať alebo určiť pomocou throws
samotného kľúčového slova.
findFile()
Metóda určuje, že IOException
môže byť vyvolaná. main()
Metóda volá túto metódu a spracováva výnimku, ak je vyvolaná.
Hádzanie viacerých výnimiek
Tu je príklad, ako môžeme pomocou throws
kľúčového slova vyvolať viac výnimiek .
import java.io.*; class Main ( public static void findFile() throws NullPointerException, IOException, InvalidClassException ( // code that may produce NullPointerException… … … // code that may produce IOException… … … // code that may produce InvalidClassException… … … ) public static void main(String() args) ( try( findFile(); ) catch(IOException e1)( System.out.println(e1.getMessage()); ) catch(InvalidClassException e2)( System.out.println(e2.getMessage()); ) ) )
Tu je findFile()
metóda určuje, že to môže hodiť NullPointerException
, IOException
a InvalidClassException
vo svojej throws
klauzuly.
Upozorňujeme, že sme nespracovali NullPointerException
. Je to preto, lebo ide o nekontrolovanú výnimku. Nie je potrebné to throws
doložiť a zaoberať sa tým.
hodí kľúčové slovo vs. skúste … chytiť … konečne
Môže existovať niekoľko metód, ktoré môžu spôsobiť výnimky. Písanie try… catch
pre každú metódu bude zdĺhavé a kód sa stane dlhým a menej čitateľným.
throws
je tiež užitočné, ak ste skontrolovali výnimku (výnimku, ktorú je potrebné spracovať), ktorú nechcete v aktuálnej metóde zachytiť.
Kľúčové slovo Java throw
throw
Kľúčové slovo sa používa explicitne vyvolaním jedinej výnimky.
Keď sa vyvolá výnimka, tok vykonávania programu sa prevedie z try
bloku do catch
bloku. throw
Kľúčové slovo používame v rámci metódy.
Jeho syntax je:
throw throwableObject;
Vrhací objekt je inštanciou triedy Throwable
alebo podtriedy Throwable
triedy.
Príklad 2: Kľúčové slovo Java throw
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Výkon
Výnimka vo vlákne „main“ java.lang.ArithmeticException: Pokus o rozdelenie 0 na Main.divideByZero (Main.java:3) na Main.main (Main.java:7) výstupný stav 1
V tomto príklade výslovne hádžeme znak ArithmeticException.
Poznámka: ArithmeticException
je nezačiarknutá výnimka. Spravidla nie je potrebné vybavovať nekontrolované výnimky.
Príklad 3: Vyhodenie skontrolovanej výnimky
import java.io.*; class Main ( public static void findFile() throws IOException ( throw new IOException("File not found"); ) public static void main(String() args) ( try ( findFile(); System.out.println("Rest of code in try block"); ) catch (IOException e) ( System.out.println(e.getMessage()); ) ) )
Výkon
Súbor nenájdený
findFile()
Metóda vyvolá IOException
so správou sme minuli jeho konstruktoru.
Upozorňujeme, že keďže ide o kontrolovanú výnimku, musíme ju uviesť v throws
klauzule.
Metódy, ktoré túto findFile()
metódu volajú, musia túto výnimku spracovať alebo ju určiť pomocou throws
samotného kľúčového slova.
Túto main
()
metódu sme vybavili touto metódou. Tok prenosu vykonávania programu z try
bloku do catch
bloku, keď je vyvolaná výnimka. Takže zvyšok kódu v try
bloku sa preskočí a catch
vykonajú sa príkazy v bloku.