CodeGym /Kursy /JAVA 25 SELF /Wprowadzenie do obsługi wyjątków

Wprowadzenie do obsługi wyjątków

JAVA 25 SELF
Poziom 11 , Lekcja 1
Dostępny

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.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION