Menu
CoddyTech

Error Checked vs Unchecked

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 61 dari 87.

Kamu sudah melihat bahwa hierarki pengecualian Java terbagi menjadi beberapa cabang. Perbedaan utama yang perlu kamu pahami adalah antara pengecualian terperiksa dan tidak terperiksa. Hal ini memengaruhi cara kamu harus menanganinya dalam kodemu.

Exception yang diperiksa adalah exception yang mengharuskan kamu menanganinya oleh compiler. Exception ini memperluas Exception secara langsung (bukan melalui RuntimeException). Kamu harus menangkapnya atau mendeklarasikannya dengan throws:

// Kamu harus menangani IOException karena ini checked exception
public void readFile(String path) throws IOException {
    FileReader reader = new FileReader(path);  // Bisa melempar IOException
}

// Atau tangkap exception-nya
public void readFileSafe(String path) {
    try {
        FileReader reader = new FileReader(path);
    } catch (IOException e) {
        System.out.println("File error: " + e.getMessage());
    }
}

Exception yang tidak diperiksa merupakan turunan dari RuntimeException. Compiler tidak mengharuskan kamu menanganinya. Exception ini biasanya menandakan kesalahan pemrograman, seperti referensi null atau akses array yang tidak valid:

// Tidak perlu deklarasi throws
public int divide(int a, int b) {
    return a / b;  // Bisa melempar ArithmeticException (tidak diperiksa)
}

String name = null;
name.length();  // NullPointerException (tidak diperiksa)

Saat membuat exception khusus, pilih parent class berdasarkan cara kamu ingin pemanggil menanganinya. Gunakan exception terperiksa untuk kondisi yang dapat dipulihkan dan sebaiknya diantisipasi oleh pemanggil. Gunakan exception tidak terperiksa untuk kesalahan pemrograman yang seharusnya tidak terjadi dalam kode yang benar.

challenge icon

Tantangan

Mudah

Mari buat sistem verifikasi usia yang menunjukkan perbedaan utama antara exception terperiksa dan tidak terperiksa! Kamu akan membuat exception kustom untuk kedua jenis tersebut dan melihat perbedaan cara compiler menanganinya.

Kamu akan mengatur kodemu dalam empat file:

  • InvalidAgeException.java: Buat exception terperiksa untuk kegagalan validasi usia. Exception ini harus langsung mewarisi Exception, yang berarti pemanggilnya akan diwajibkan untuk menanganinya. Sertakan constructor yang menerima pesan dan meneruskannya ke class induk.
  • NegativeAgeException.java: Buat exception tidak terperiksa untuk kondisi ketika seseorang memberikan usia negatif (kesalahan pemrograman yang seharusnya tidak terjadi jika inputnya benar). Exception ini harus mewarisi RuntimeException. Sertakan constructor yang menerima pesan dan meneruskannya ke class induk.
  • AgeVerifier.java: Buat class yang memvalidasi usia menggunakan kedua jenis exception. Sertakan dua fungsi static:

    verifyAge(int age) - Fungsi ini harus melempar NegativeAgeException (tidak terperiksa) dengan pesan "Age cannot be negative: [age]" jika usia kurang dari 0. Jika usia kurang dari 18, lempar InvalidAgeException (terperiksa) dengan pesan "Must be 18 or older: [age]". Jika tidak, cetak Age [age] verified successfully. Karena fungsi ini melempar exception terperiksa, kamu harus mendeklarasikannya dengan throws InvalidAgeException.

    verifyAgeUncheckedOnly(int age) - Fungsi ini hanya menggunakan exception tidak terperiksa. Jika usia negatif, lempar NegativeAgeException dengan format pesan yang sama. Jika usia kurang dari 18, lempar IllegalArgumentException dengan pesan "Too young: [age]". Jika tidak, cetak Age [age] verified (unchecked method). Perhatikan bahwa fungsi ini tidak memerlukan deklarasi throws!

  • Main.java: Satukan sistem verifikasimu! Kamu akan menerima satu input: usia (bilangan bulat).

    Pertama, cetak === Checked Exception Method === dan panggil verifyAge dengan usia input. Karena fungsi ini melempar exception terperiksa, kamu harus membungkusnya dengan try-catch. Tangkap InvalidAgeException dan cetak Checked exception caught: [message]. Tangkap juga NegativeAgeException dan cetak Unchecked exception caught: [message].

    Kemudian, cetak satu baris kosong dan === Unchecked Exception Method ===. Panggil verifyAgeUncheckedOnly dengan usia yang sama. Meskipun fungsi ini dapat melempar exception, kamu tidak diwajibkan untuk menangkapnya. Namun, bungkus fungsi ini dengan try-catch untuk menangani error dengan baik. Tangkap NegativeAgeException dan cetak Runtime exception caught: [message]. Tangkap IllegalArgumentException dan cetak Illegal argument caught: [message].

Kamu akan menerima satu input: bilangan bulat yang menunjukkan usia yang akan diverifikasi.

Perhatikan perbedaan utamanya: fungsi dengan exception terperiksa memerlukan deklarasi throws dan mewajibkan pemanggilnya untuk menanganinya, sedangkan fungsi dengan exception tidak terperiksa dapat dikompilasi tanpa penanganan exception. Inilah perbedaan mendasar antara exception terperiksa dan tidak terperiksa di Java!

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int age = scanner.nextInt();
        
        // TODO: Uji method dengan checked exception
        // Cetak: "=== Checked Exception Method ==="
        // Panggil AgeVerifier.verifyAge(age) di dalam try-catch
        // - Tangkap InvalidAgeException: cetak "Checked exception caught: [message]"
        // - Tangkap NegativeAgeException: cetak "Unchecked exception caught: [message]"
        
        
        // TODO: Cetak baris kosong, lalu "=== Unchecked Exception Method ==="
        // Panggil AgeVerifier.verifyAgeUncheckedOnly(age) di dalam try-catch
        // - Tangkap NegativeAgeException: cetak "Runtime exception caught: [message]"
        // - Tangkap IllegalArgumentException: cetak "Illegal argument caught: [message]"
        
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online