Sobes.tech
Middle

Jakiego typu wyjątku w Java nie można obsłużyć?

sobes.tech AI

Odpowiedź od AI

Błąd.

Java dzieli wyjątki (Throwable) na trzy główne typy:

  1. Sprawdzane wyjątki: Wymagają obowiązkowego obsługiwania lub deklaracji w sygnaturze metody (throws).
  2. Nie sprawdzane wyjątki (Runtime Exceptions): Nie wymagają obowiązkowej obsługi. Zazwyczaj wskazują na błędy w logice programu.
  3. Błędy: Reprezentują poważne problemy związane z maszyną wirtualną Java lub zasobami systemowymi. Nie można ich obsługiwać na poziomie aplikacji, ponieważ nie są to problemy samego kodu.

Przykłady Error:

  • OutOfMemoryError: Maszyna wirtualna Java nie mogła przydzielić pamięci.
  • StackOverflowError: Doszło do przepełnienia stosu (zbyt głęboka rekurencja).
  • InternalError: Błąd wewnętrzny maszyny wirtualnej Java.

Obsługa Error za pomocą try-catch nie ma sensu, ponieważ te błędy wskazują na stany, z których aplikacja zazwyczaj nie może się skutecznie odzyskać. Zamiast tego, gdy wystąpi Error, aplikacja zwykle kończy działanie.

Chociaż technicznie można napisać catch (Error e), taki kod jest uważany za złą praktykę i nie rozwiązuje głównego problemu.

try {
    // Kod, który może wywołać OutOfMemoryError
    List<Object> list = new ArrayList<>();
    while (true) {
        list.add(new Object());
    }
} catch (OutOfMemoryError e) {
    // Ten blok zostanie wykonany, ale nie będziesz mógł się odzyskać,
    // ponieważ system nie ma wystarczającej pamięci.
    System.err.println("Brak pamięci! Aplikacja prawdopodobnie się zakończy.");
    // Dalsze działania tutaj są bezużyteczne lub spowodują SecurityException
} catch (Exception e) {
    // Obsługa innych wyjątków
    e.printStackTrace();
}

W automatyzacji QA, jeśli podczas wykonywania testu pojawi się Error, oznacza to raczej problem z środowiskiem testowym, nieprawidłową konfigurację JVM lub poważną usterkę samej aplikacji, która doprowadziła do krytycznego błędu, a nie oczekiwaną obsługiwaną wyjątkową sytuację. Takie scenariusze wymagają zbadania przyczyny głównej poza kodem testowym.