V tomto kurzu se naučíme používat klíčové slovo throw and throws pro zpracování výjimek pomocí příkladů.
V Javě lze výjimky rozdělit do dvou typů:
- Nekontrolované Výjimky: Oni nejsou kontrolovány při kompilaci-time, ale při spuštění time.For například:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
výjimky v rámciError
třídy, atd - Zkontrolované výjimky: Jsou zkontrolovány v době kompilace. Například
IOException
,InterruptedException
atd
V části Výjimky Java se dozvíte podrobněji o kontrolovaných a nekontrolovaných výjimkách.
Obvykle nepotřebujeme zpracovávat nezaškrtnuté výjimky. Je to proto, že k nekontrolovaným výjimkám dochází kvůli programovacím chybám. Osvědčeným postupem je místo manipulace je opravit.
Tento kurz se nyní zaměří na to, jak zacházet s kontrolovanými výjimkami pomocí throw
a throws
.
Java hodí klíčové slovo
throws
Klíčové slovo v deklaraci metody používáme k deklaraci typu výjimek, které se v něm mohou vyskytnout.
Jeho syntaxe je:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Jak vidíte z výše uvedené syntaxe, můžeme použít throws
k deklaraci více výjimek.
Příklad 1: Java vyvolá klíč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ýstup
java.io.FileNotFoundException: test.txt (žádný takový soubor nebo adresář)
Když spustíme tento program, pokud soubor test.txt
neexistuje, FileInputStream
hodí a FileNotFoundException
který rozšiřuje IOException
třídu.
Pokud metoda nezpracovává výjimky, typ výjimek, které se v ní mohou vyskytnout, musí být zadán v throws
klauzuli, aby je metody, které jsou dále v zásobníku volání, mohly zpracovat nebo je určit pomocí throws
samotného klíčového slova.
findFile()
Metoda určuje, že IOException
může být vyvolána. main()
Metoda volá tuto metodu a zpracovává výjimku, pokud je vyvolána.
Vyvolání několika výjimek
Zde je ukázka, jak můžeme pomocí throws
klíčového slova vyvolat více výjimek .
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()); ) ) )
Zde je findFile()
metoda určuje, že to může hodit NullPointerException
, IOException
a InvalidClassException
ve své throws
klauzule.
Všimněte si, že jsme nezpracovali NullPointerException
. Je to proto, že se jedná o nezaškrtnutou výjimku. Není nutné jej v throws
klauzuli specifikovat a zpracovávat.
hodí klíčové slovo Vs. zkuste … chytit … konečně
Může existovat několik metod, které mohou způsobit výjimky. Psaní try… catch
pro každou metodu bude zdlouhavé a kód se stane dlouhým a méně čitelným.
throws
je také užitečné, když jste zkontrolovali výjimku (výjimku, která musí být zpracována), kterou nechcete zachytit ve své aktuální metodě.
Klíčové slovo Java hodu
throw
Klíčové slovo se používá explicitně vyvoláním jediné výjimky.
Když je vyvolána výjimka, tok provádění programu se přenáší z try
bloku do catch
bloku. throw
Klíčové slovo používáme v rámci metody.
Jeho syntaxe je:
throw throwableObject;
Vrhací objekt je instancí třídy Throwable
nebo podtřídy Throwable
třídy.
Příklad 2: Klíč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ýstup
Výjimka ve vlákně "main" java.lang.ArithmeticException: Pokus o dělení 0 na Main.divideByZero (Main.java:3) na Main.main (Main.java:7) stav ukončení 1
V tomto příkladu jsme výslovně házeli ArithmeticException.
Poznámka: ArithmeticException
je nezaškrtnutá výjimka. Obvykle není nutné zpracovávat nezaškrtnuté výjimky.
Příklad 3: Vyhodení zaškrtnuté výjimky
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ýstup
Soubor nenalezen
findFile()
Metoda vyvolá IOException
se zprávou jsme minuli jeho konstruktoru.
Všimněte si, že protože se jedná o kontrolovanou výjimku, musíme ji specifikovat v throws
klauzuli.
Metody, které volají tuto findFile()
metodu, musí tuto výjimku zpracovat nebo ji zadat pomocí throws
samotného klíčového slova.
Tuto main
()
metodu jsme zpracovali v metodě. Tok provádění přenosu programu z try
bloku do catch
bloku při vyvolání výjimky. Takže zbytek kódu v try
bloku je přeskočen a příkazy v catch
bloku jsou provedeny.