Sobes.tech
Middle

Na czym polega różnica między wyjątkami w Kotlinie a Java?

sobes.tech AI

Odpowiedź od AI

Główna różnica w obsłudze sprawdzanych (checked) wyjątków.

W Javie istnieją dwa typy wyjątków:

  • Sprawdzane (Checked Exception): wymagają jawnej obsługi w bloku try-catch lub deklaracji w sygnaturze metody słowem kluczowym throws. Przykłady: IOException, FileNotFoundException.
  • Nie sprawdzane (Unchecked Exception): nie wymagają jawnej obsługi. Przykłady: RuntimeException i jej podklasy, Error.

W Kotlinie nie ma sprawdzanych wyjątków. Wszystkie wyjątki w Kotlinie są w zasadzie nie sprawdzane. Ułatwia to kod, ponieważ nie trzeba powszechnie używać try-catch lub throws dla rutynowych operacji, które mogą wyrzucić wyjątek.

Przykład w Javie:

// Java
public class FileRead {
    public void readFile() throws IOException { // Obowiązkowe deklarowanie
        BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }
}

Przykład w Kotlinie:

// Kotlin
import java.io.File

fun readFile() { // Nie trzeba deklarować throws
    File("file.txt").forEachLine {
        println(it)
    }
}

Pomimo braku sprawdzanych wyjątków, Kotlin nadal może je wyrzucać i obsługiwać (np. te, które są wyrzucane z bibliotek Java), używając bloków try-catch-finally. Służy to kompatybilności z istniejącym kodem Java.

// Kotlin
import java.io.IOException

fun readFileSafe() {
    try {
        readFile() // Wywołanie funkcji, która może wyrzucić IOException
    } catch (e: IOException) {
        println("Błąd odczytu pliku: ${e.message}")
    } finally {
        println("Operacja na pliku zakończona.")
    }
}

Podsumowując: Kotlin upraszcza rozwój, eliminując konieczność obowiązkowego obsługiwania sprawdzanych wyjątków, polegając bardziej na wyjątkach w czasie działania i standardowych obsługach błędów tam, gdzie jest to konieczne.