Sobes.tech
Middle

Opowiedz o mechanizmie wyjątków w Java.

sobes.tech AI

Odpowiedź od AI

W Javie mechanizm obsługi wyjątków jest używany do obsługi błędów i innych sytuacji wyjątkowych, które występują podczas wykonywania programu.

Główne elementy mechanizmu obsługi wyjątków:

  • Wyjątek (Exception): Obiekt reprezentujący zdarzenie, które zakłóca normalny przebieg wykonywania programu.
  • Bloki try, catch, finally: Służą do obsługi wyjątków.
    • try: Blok kodu, w którym może wystąpić wyjątek.
    • catch: Blok kodu, który jest wykonywany, jeśli w bloku try wystąpi wyjątek określonego typu.
    • finally: Blok kodu, który zawsze jest wykonywany, niezależnie od tego, czy wystąpił wyjątek, czy nie. Służy do zwalniania zasobów.
  • Słowo kluczowe throw: Używane do jawnego tworzenia i rzucania wyjątku.
  • Słowo kluczowe throws: Używane w sygnaturze metody do deklarowania typów wyjątków, które metoda może rzucić.

Hierarchia wyjątków w Javie:

  • Throwable: Klasa bazowa dla wszystkich wyjątków i błędów.
    • Error: Reprezentuje poważne problemy, z których program zwykle nie może się odzyskać (np. OutOfMemoryError).
    • Exception: Reprezentuje wyjątki, które program może przechwycić i obsłużyć.
      • RuntimeException (Niekontrolowane wyjątki): Wyjątki, które nie wymagają jawnej obsługi lub deklaracji w sygnaturze metody (np. NullPointerException, ArrayIndexOutOfBoundsException).
      • Sprawdzane wyjątki (Checked Exceptions): Wyjątki, które muszą być obsłużone za pomocą bloku try-catch lub zadeklarowane za pomocą throws w sygnaturze metody (np. IOException, FileNotFoundException).

Przykład obsługi wyjątku:

public class ExceptionExample {

    public static void main(String[] args) {
        try {
            int result = divide(10, 0);
            System.out.println("Wynik: " + result);
        } catch (ArithmeticException e) {
            // Obsługa wyjątku ArithmeticException
            System.err.println("Błąd: dzielenie przez zero nie jest dozwolone.");
            System.err.println("Szczegóły wyjątku: " + e.getMessage());
            e.printStackTrace(); // wyświetla stos wywołań
        } finally {
            // Ten blok zawsze się wykona
            System.out.println("Blok finally wykonany.");
        }
    }

    public static int divide(int a, int b) {
        // Może rzucić ArithmeticException, gdy b = 0
        return a / b;
    }
}

Przykład użycia throws:

import java.io.FileReader;
import java.io.IOException;

public class ThrowsExample {

    public static void readFile(String filename) throws IOException {
        // Może rzucić IOException
        FileReader reader = new FileReader(filename);
        // Dalsza praca z plikiem
    }

    public static void main(String[] args) {
        try {
            readFile("nieistniejący_plik.txt");
        } catch (IOException e) {
            System.err.println("Błąd odczytu pliku: " + e.getMessage());
        }
    }
}