Podczas wykonywania programu mogą wystąpić błędy. To częsty problem każdego programisty, od początkującego po prawdziwego profesjonalistę. Nie wszystkie błędy powstają z winy programisty. Niektóre z nich są trudne do przewidzenia, a czasami nie jest to możliwe. Na przykład podczas pobierania programu połączenie sieciowe może nagle zostać zerwane lub może nastąpić przerwa w dostawie prądu. Takie sytuacje nazywane są wyjątkami. Try i catch to części konstrukcji używane do obsługi wyjątków.
Java spróbuj złapać blok
Gdy wystąpi błąd, Java zwykle zatrzymuje się i generuje komunikat o błędzie. Ten proces nazywa się „Java zgłasza wyjątek”. Java zapewnia specjalne możliwości obsługi wyjątków. Jednym z nich jest próba… złapanie… wreszcie konstrukcja. Oto składnia bloku try, bloku catch i bloku wreszcie.//try block
try {
// Block of code to try
}
//try catch
catch(Exception e) {
// Block of code to handle errors
}
finally {
// Optional block of code
}
Kiedy w bloku try wystąpi wyjątek, kontrola przechodzi do bloku catch, który może obsłużyć wyjątek. Jeżeli taki blok nie zostanie znaleziony, użytkownikowi zostanie wyświetlony komunikat o nieobsługiwanym wyjątku i dalsze wykonywanie programu zostanie zatrzymane. Aby zapobiec takiemu zatrzymaniu awaryjnemu należy zastosować blok try..catch.
Krótko o try, catch, na koniec rzuca słowa kluczowe
Obsługa wyjątków w Javie opiera się na użyciu w programie następujących słów kluczowych:- try — definiuje blok kodu, w którym może wystąpić wyjątek;
- catch — definiuje blok kodu, w którym obsługiwany jest wyjątek;
- wreszcie — definiuje blok kodu, który jest opcjonalny, ale jeśli jest obecny, i tak jest wykonywany, niezależnie od wyników bloku try.
- rzut — używany do zgłoszenia wyjątku;
- rzuty — używane w sygnaturach metod, aby ostrzec, że metoda może zgłosić wyjątek.
Łatwy przykład konstrukcji typu try-catch
Załóżmy, że mamy program z jakąś tablicą.public class TryTest {
public static void main(String[] args) {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
}
}
Ponieważ próbujemy uzyskać dostęp do elementu tablicy z nieistniejącym indeksem, program zakończy się z błędem:
Wyjątek w wątku „main” java.lang.ArrayIndexOutOfBoundsException: Indeks 7 poza zakresem dla długości 5 w dniach.TryTest.main(TryTest.java:6) Proces zakończony kodem zakończenia 1
Zmodyfikujmy ten program i obsłużmy ten wyjątek za pomocą try-catch. Najpierw spróbuj blokować, później złap blok.
//try catch example
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
System.out.println("The exception was handled...");
}
System.out.println("This is the end of the program...");
}
}
Teraz dane wyjściowe uległy zmianie:
Wyjątek został obsłużony... To koniec programu... Proces zakończony kodem zakończenia 0 Proces zakończony kodem zakończenia 0
W tym wypadku program zakończył się poprawnie, na ekranie wyświetli się nasz komunikat. Prawidłowe zakończenie programu sygnalizowane jest kodem 0 na koniec procesu, natomiast niepoprawne — 1. W przypadku użycia bloku try...catch w pierwszej kolejności wykonywane są wszystkie instrukcje znajdujące się pomiędzy instrukcjami try i catch. Jeśli w bloku try wystąpi wyjątek, normalna kolejność wykonywania zostanie zatrzymana i przejdzie do instrukcji catch. Dlatego też, gdy wykonanie programu osiągnie liczby[7]=8; linii program zatrzyma się i przejdzie do bloku catch. W naszym przypadku zadeklarowaliśmy zmienną myEx o typie Wyjątek. Jest to klasa bazowa dla wszystkich wyjątków, więc mogą się one różnić. Istnieją na przykład wyjątki odpowiedzialne za przepełnienie stosu, wykraczające poza indeksowanie tablicy, jak w naszym przypadku wskazujące na Null i tak dalej. Gdybyśmy nie odgadli rodzaju wyjątku, program również zakończyłby się niepoprawnie. Jednak dla uproszczenia przykładu wybraliśmy typ wyjątku i jest to klasa bazowa dla wszystkich wyjątków. Zatem instrukcja catch (Exception myEx) obsłuży prawie wszystkie wyjątki. Obsługa wyjątku w tym przypadku. Po zakończeniu bloku catch program kontynuuje swoją pracę, wykonując wszystkie pozostałe instrukcje po bloku catch. Jeśli chcesz zobaczyć, jakie wystąpiły wyjątki, możesz poprosić program o wydrukowanie śladu stosu wywołań metod. Oto, co robi JVM, gdy wystąpi nieprzechwycony wyjątek: zatrzymuje wykonywanie programu i drukuje ślad stosu po wykonaniu kodu bloku last, jeśli istnieje.
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
myEx.printStackTrace();
}
System.out.println("This is the end of the program...");
}
}
Obsługa wyjątku w tym przypadku sprowadza się do wydrukowania stosu śledzenia błędów na konsolę za pomocą metody printStackTrace() zdefiniowanej w klasie Wyjątek .
java.lang.ArrayIndexOutOfBoundsException: Indeks 7 poza zakresem dla długości 5 w dniach.TryTest.main(TryTest.java:7) To jest koniec programu... Proces zakończony kodem zakończenia 0
Jednak program zakończył działanie poprawnie.
Wreszcie! Po złapaniu
W przykładzie oraz w definicjach słów kluczowych dotyczących obsługi wyjątków wspomnieliśmy o bloku final. Jest to opcjonalne, ale jeśli jest obecne, zostanie wykonane niezależnie od wyników bloku try. Zmieńmy typ wyjątku na NullPointerException.public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (NullPointerException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
Oto dane wyjściowe:
Wyjątek w wątku „main” java.lang.ArrayIndexOutOfBoundsException: Indeks 7 poza zakresem dla długości 5 w dniach.TryTest.main(TryTest.java:7) w końcu Proces zakończony z kodem zakończenia 1
Przy okazji możemy określić, jaki typ wyjątku będzie poprawny. Tutaj jest to wyjątek IndexOutOfBoundsException.
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (IndexOutOfBoundsException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
W tym przypadku wynik będzie następujący:
Wyjątek został obsłużony... w końcu To koniec programu... Proces zakończył się kodem zakończenia 0
Jak działają wyjątki?
Rzecz w tym, że wszystkich tych słów —catch, Throw, Throwable można używać tylko z językiem java.lang.Throwable lub jego potomkami. Możesz na przykład to zrobić:public class MyClass {
public static void main(String[] args) {
try {
} catch (Throwable thr) {
}
}
}
Nie można jednak tego zrobić w ten sposób:
public class MyClass {
public static void main(String[] args) {
try {
} catch (String thr) {
}
}
}
GO TO FULL VERSION