W tym samouczku nauczymy się używać słów kluczowych throw i throws do obsługi wyjątków z pomocą przykładów.
W Javie wyjątki można podzielić na dwa typy:
- Wyjątki niesprawdzonych: nie są one sprawdzane w czasie kompilacji, ale w run-time.For przykład:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, wyjątki przewidziane wError
klasie, itp - Zaznaczone wyjątki: są sprawdzane w czasie kompilacji. Na przykład
IOException
,InterruptedException
itd
Zapoznaj się z tematem Wyjątki Java, aby uzyskać szczegółowe informacje na temat zaznaczonych i niezaznaczonych wyjątków.
Zwykle nie musimy obsługiwać niezaznaczonych wyjątków. Dzieje się tak, ponieważ niezaznaczone wyjątki występują z powodu błędów programowania. I dobrą praktyką jest poprawianie ich zamiast zajmowania się nimi.
W tym samouczku skupimy się teraz na obsłudze zaznaczonych wyjątków przy użyciu throw
i throws
.
Java wyrzuca słowo kluczowe
Używamy throws
słowa kluczowego w deklaracji metody, aby zadeklarować typ wyjątków, które mogą w niej wystąpić.
Jego składnia to:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Jak widać z powyższej składni, możemy użyć throws
do zadeklarowania wielu wyjątków.
Przykład 1: Java zgłasza słowo kluczowe
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); ) ) )
Wynik
java.io.FileNotFoundException: test.txt (Brak takiego pliku lub katalogu)
Kiedy uruchamiamy ten program, jeśli plik test.txt
nie istnieje, FileInputStream
wyrzuca a, FileNotFoundException
który rozszerza IOException
klasę.
Jeśli metoda nie obsługuje wyjątków, typ wyjątków, które mogą w niej wystąpić, musi być określony w throws
klauzuli, aby metody znajdujące się dalej w stosie wywołań mogły je obsłużyć lub określić za pomocą throws
samych słów kluczowych.
findFile()
Metoda określa, że IOException
może zostać wyrzucony. main()
Metoda nazywa tę metodę i obsługuje wyjątek jeśli jest wyrzucane.
Zgłaszanie wielu wyjątków
Oto jak możemy zgłosić wiele wyjątków za pomocą throws
słowa kluczowego.
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()); ) ) )
Tutaj findFile()
metoda określa, że można go wyrzucić NullPointerException
, IOException
i InvalidClassException
na jego throws
punkcie.
Zauważ, że nie obsłużyliśmy NullPointerException
. Dzieje się tak, ponieważ jest to niezaznaczony wyjątek. Nie ma potrzeby określania tego w throws
klauzuli i obsługi.
rzuca słowo kluczowe vs. spróbuj… złapać… wreszcie
Może istnieć kilka metod, które mogą powodować wyjątki. Pisanie try… catch
dla każdej metody będzie żmudne, a kod stanie się długi i mniej czytelny.
throws
jest również przydatne, gdy zaznaczyłeś wyjątek (wyjątek, który musi być obsłużony), którego nie chcesz przechwytywać w swojej aktualnej metodzie.
Słowo kluczowe throw w języku Java
Słowo throw
kluczowe służy do jawnego zgłaszania pojedynczego wyjątku.
Gdy zostanie zgłoszony wyjątek, przepływ wykonywania programu przenosi się z try
bloku do catch
bloku. Używamy throw
słowa kluczowego w metodzie.
Jego składnia to:
throw throwableObject;
Obiekt do rzucania jest instancją klasy Throwable
lub podklasy tej Throwable
klasy.
Przykład 2: słowo kluczowe throw w języku Java
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Wynik
Wyjątek w wątku „main” java.lang.ArithmeticException: Próba podzielenia przez 0 w Main.divideByZero (Main.java:3) w Main.main (Main.java:7) status wyjścia 1
W tym przykładzie jawnie rzucamy plik ArithmeticException.
Uwaga: ArithmeticException
to niezaznaczony wyjątek. Zwykle nie ma potrzeby obsługi niezaznaczonych wyjątków.
Przykład 3: Zgłaszanie zaznaczonego wyjątku
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()); ) ) )
Wynik
Nie znaleziono pliku
findFile()
Metoda wyrzuca IOException
z komunikatem mijaliśmy do jego konstruktora.
Zauważ, że ponieważ jest to sprawdzony wyjątek, musimy określić go w throws
klauzuli.
Metody, które wywołują tę findFile()
metodę, muszą albo obsługiwać ten wyjątek, albo throws
same określać go za pomocą słowa kluczowego.
Obsługiwaliśmy ten wyjątek w main
()
metodzie. Przepływ wykonywania programu przenosi się z try
bloku do catch
bloku, gdy zostanie zgłoszony wyjątek. Zatem reszta kodu w try
bloku jest pomijana, a instrukcje w catch
bloku są wykonywane.