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 wErrorklasie, itp - Zaznaczone wyjątki: są sprawdzane w czasie kompilacji. Na przykład
IOException,InterruptedExceptionitd
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 throwi throws.
Java wyrzuca słowo kluczowe
Używamy throwssł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ć throwsdo 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.txtnie istnieje, FileInputStreamwyrzuca a, FileNotFoundExceptionktóry rozszerza IOExceptionklasę.
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 throwsklauzuli, aby metody znajdujące się dalej w stosie wywołań mogły je obsłużyć lub określić za pomocą throwssamych słów kluczowych.
findFile()Metoda określa, że IOExceptionmoż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ą throwssł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, IOExceptioni InvalidClassExceptionna jego throwspunkcie.
Zauważ, że nie obsłużyliśmy NullPointerException. Dzieje się tak, ponieważ jest to niezaznaczony wyjątek. Nie ma potrzeby określania tego w throwsklauzuli 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… catchdla 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 throwkluczowe służy do jawnego zgłaszania pojedynczego wyjątku.
Gdy zostanie zgłoszony wyjątek, przepływ wykonywania programu przenosi się z trybloku do catchbloku. Używamy throwsłowa kluczowego w metodzie.
Jego składnia to:
throw throwableObject;
Obiekt do rzucania jest instancją klasy Throwablelub podklasy tej Throwableklasy.
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 IOExceptionz komunikatem mijaliśmy do jego konstruktora.
Zauważ, że ponieważ jest to sprawdzony wyjątek, musimy określić go w throwsklauzuli.
Metody, które wywołują tę findFile()metodę, muszą albo obsługiwać ten wyjątek, albo throwssame określać go za pomocą słowa kluczowego.
Obsługiwaliśmy ten wyjątek w main()metodzie. Przepływ wykonywania programu przenosi się z trybloku do catchbloku, gdy zostanie zgłoszony wyjątek. Zatem reszta kodu w trybloku jest pomijana, a instrukcje w catchbloku są wykonywane.








