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.
Tantangan
MudahMari 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 mewarisiException, 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 mewarisiRuntimeException. 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 melemparNegativeAgeException(tidak terperiksa) dengan pesan"Age cannot be negative: [age]"jika usia kurang dari 0. Jika usia kurang dari 18, lemparInvalidAgeException(terperiksa) dengan pesan"Must be 18 or older: [age]". Jika tidak, cetakAge [age] verified successfully. Karena fungsi ini melempar exception terperiksa, kamu harus mendeklarasikannya denganthrows InvalidAgeException.verifyAgeUncheckedOnly(int age)- Fungsi ini hanya menggunakan exception tidak terperiksa. Jika usia negatif, lemparNegativeAgeExceptiondengan format pesan yang sama. Jika usia kurang dari 18, lemparIllegalArgumentExceptiondengan pesan"Too young: [age]". Jika tidak, cetakAge [age] verified (unchecked method). Perhatikan bahwa fungsi ini tidak memerlukan deklarasithrows!Main.java: Satukan sistem verifikasimu! Kamu akan menerima satu input: usia (bilangan bulat).Pertama, cetak
=== Checked Exception Method ===dan panggilverifyAgedengan usia input. Karena fungsi ini melempar exception terperiksa, kamu harus membungkusnya dengan try-catch. TangkapInvalidAgeExceptiondan cetakChecked exception caught: [message]. Tangkap jugaNegativeAgeExceptiondan cetakUnchecked exception caught: [message].Kemudian, cetak satu baris kosong dan
=== Unchecked Exception Method ===. PanggilverifyAgeUncheckedOnlydengan 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. TangkapNegativeAgeExceptiondan cetakRuntime exception caught: [message]. TangkapIllegalArgumentExceptiondan cetakIllegal 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]"
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online