1. Zapoznanie z wyjątkami
Zacznijmy od prostej analogii. Wyobraź sobie, że twój program — to samochód jadący po drodze. Wszystko jest w porządku, dopóki nagle nie wydarzy się coś nieoczekiwanego: złapałeś gumę, skończyło się paliwo, silnik się przegrzał. Jeśli nie „obsłużysz” tej sytuacji (np. nie założysz koła zapasowego albo nie zatankujesz), samochód się zatrzyma i dalej nie pojedzie. Tak samo w programie: jeśli nie obsłużysz wyjątku, program zakończy się awaryjnie.
Wyjątek (exception) — to obiekt tworzony w momencie wystąpienia jakiegoś problemu podczas wykonywania programu. Wyjątek komunikuje: „Stop! Coś poszło nie tak!”
Przykłady sytuacji, w których powstają wyjątki:
- Dzielenie przez zero (10 / 0)
- Próba odwołania się do nieistniejącego elementu tablicy (arr[999])
- Otwarcie pliku, którego nie ma na dysku
- Konwersja łańcucha "abc" na liczbę (Integer.parseInt("abc"))
Ważne: Wyjątki to nie błędy kompilacji (np. literówki w kodzie), lecz problemy, które pojawiają się już w czasie działania programu.
Dlaczego wyjątki są dobre?
- Czysty kod: Główna logika programu nie jest zaśmiecana ciągłymi sprawdzeniami każdej drobnostki.
- Elastyczność: Można centralnie obsługiwać błędy (np. wszystkie błędy odczytu plików — w jednym miejscu).
- Niezawodność: Program nie „wysypuje się” z tajemniczym komunikatem, lecz informuje, co dokładnie się stało.
2. Wyjątki (Exceptions) vs Błędy (Errors)
W Javie są dwa główne typy problemów, które mogą pojawić się podczas działania programu:
Błędy (Errors)
Błędy — to fatalne, nieodwracalne problemy wynikające z awarii samej wirtualnej maszyny Javy (JVM). Zwykle są związane z zasobami komputera lub wewnętrznymi awariami JVM.
Przykłady błędów:
- OutOfMemoryError — skończyła się pamięć.
- StackOverflowError — przepełnienie stosu (np. z powodu nieskończonej rekurencji).
Ważne: Takich błędów zwykle nie należy próbować obsługiwać w programie.
Wyjątki (Exceptions)
Wyjątki — to problemy, z którymi program może (i powinien) sobie poradzić. Powstają wskutek błędów w logice programu lub czynników zewnętrznych (np. użytkownik podał coś innego, niż oczekiwano).
Przykłady wyjątków:
- NullPointerException — próba użycia null jako obiektu.
- ArrayIndexOutOfBoundsException — wyjście poza zakres tablicy.
- IOException — błąd podczas pracy z plikami.
Wyjątki w Javie występują w dwóch rodzajach:
- Checked exceptions (sprawdzane) — kompilator wymaga ich obsłużenia (np. IOException).
- Unchecked exceptions (niesprawdzane) — kompilator nie wymaga ich obsługi (np. NullPointerException).
Schemat: co gdzie się znajduje
graph TD
Throwable --> Error
Throwable --> Exception
Exception --> RuntimeException
Exception --> Checked["(inne wyjątki)"]
style Throwable fill:#ffa64d,color:#000
style Exception fill:#ffa64d,color:#000
style Checked fill:#ffa64d,color:#000
style Error fill:#ff4d4d,color:#fff
style RuntimeException fill:#4dff88,color:#000
Objaśnienie:
- Throwable — korzeń całej hierarchii błędów i wyjątków w Javie.
- Error — fatalne błędy JVM, nie są obsługiwane.
- Exception — „normalne” wyjątki, które można i trzeba obsługiwać.
- RuntimeException — niesprawdzane wyjątki (błędy programisty).
3. Jak to wygląda w kodzie?
Przykład 1: Dzielenie przez zero
public class ExceptionDemo
{
public static void main(String[] args)
{
int a = 10;
int b = 0;
int c = a / b; // Tutaj wystąpi ArithmeticException!
System.out.println("Wynik: " + c);
}
}
Co się stanie?
Program zakończy się błędem i zobaczysz komunikat:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionDemo.main(ExceptionDemo.java:5)
Przykład 2: Odwołanie do nieistniejącego elementu tablicy
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException
Przykład 3: Praca z plikami
import java.io.FileReader;
import java.io.IOException;
public class FileDemo
{
public static void main(String[] args) throws IOException
{
FileReader reader = new FileReader("nofile.txt"); // FileNotFoundException (checked)
int data = reader.read();
System.out.println(data);
reader.close();
}
}
A teraz przyjrzymy się, jak elegancko obsługiwać takie sytuacje wyjątkowe.
GO TO FULL VERSION