CodeGym /Java Blog /Acak /Pengecualian: dicentang, tidak dicentang, dan khusus
John Squirrels
Level 41
San Francisco

Pengecualian: dicentang, tidak dicentang, dan khusus

Dipublikasikan di grup Acak
Hai! Dalam pelajaran terakhir, kami berkenalan dengan pengecualian dalam bahasa Jawa, dan melihat contoh cara bekerja dengannya. Hari ini kita akan melihat lebih dalam struktur pengecualian, dan belajar bagaimana menulis pengecualian kita sendiri :)

Jenis pengecualian

Seperti yang kami katakan sebelumnya, ada banyak pengecualian di Jawa, hampir 400! Tapi mereka semua dibagi menjadi beberapa kelompok, jadi cukup mudah untuk mengingatnya. Begini tampilannya: Pengecualian: dicentang, tidak dicentang, dan khusus - 2 Semua pengecualian memiliki nenek moyang yang sama di Throwablekelas. Dua kelompok utama diturunkan darinya: pengecualian ( Exception ) dan kesalahan ( Error ). Error - Ini menunjukkan error run-time kritis yang terkait dengan pengoperasian mesin virtual Java. Dalam kebanyakan kasus, Error tidak perlu ditangani, karena ini menunjukkan beberapa kelemahan serius dalam kode. Yang paling terkenal adalah StackOverflowError (ini terjadi, misalnya, ketika sebuah metode memanggil dirinya tanpa henti) dan OutOfMemoryError(ini terjadi bila tidak ada cukup memori untuk membuat objek baru). Seperti yang Anda lihat, dalam situasi ini, biasanya sama sekali tidak ada yang perlu ditangani saat dijalankan: kode ditulis dengan tidak benar dan perlu dikerjakan ulang. Pengecualian - Ini mewakili, yah, pengecualian: situasi luar biasa dan tidak direncanakan yang terjadi saat program sedang berjalan. Mereka tidak seserius Error, tetapi mereka tetap membutuhkan perhatian kita. Semua pengecualian dibagi menjadi 2 jenis: dicentang dan tidak dicentang . Pengecualian: dicentang, tidak dicentang, dan khusus - 3 Semua pengecualian yang diperiksa berasal dari Exceptionkelas. Apa artinya "diperiksa"? Kami menyinggung hal ini dalam pelajaran terakhir: "Oleh karena itu, compiler Java mengetahui pengecualian yang paling umum dan situasi di mana hal itu mungkin terjadi." Misalnya, ia mengetahui bahwa jika kode membaca data dari suatu file, file tersebut dapat dengan mudah tidak ada. Dan ada banyak situasi seperti itu (yang dapat disimpulkan). Oleh karena itu, kompiler memeriksa kode kami terlebih dahulu untuk mengetahui kemungkinan pengecualian ini. Jika ditemukan, kode tidak akan dikompilasi sampai kami menanganinya atau membuangnya kembali. Jenis pengecualian kedua adalah "tidak dicentang". Mereka berasal dari RuntimeExceptionkelas. Apa bedanya dengan pengecualian yang diperiksa? Tampaknya ada juga banyak kelas berbeda yang berasalRuntimeException(yang menjelaskan pengecualian runtime). Perbedaannya adalah kompiler tidak mengantisipasi kesalahan ini. Tampaknya mengatakan, "Ketika kode ditulis, saya tidak menemukan sesuatu yang mencurigakan, tetapi ada yang tidak beres saat sedang berjalan. Rupanya, ada kesalahan dalam kode!" Dan memang ini benar. Pengecualian yang tidak dicentang paling sering merupakan hasil dari kesalahan pemrogram. Dan kompiler jelas tidak dapat meramalkan setiap kemungkinan situasi buruk yang mungkin dibuat orang dengan tangan mereka sendiri. :) Oleh karena itu, tidak memeriksa apakah pengecualian tersebut ditangani dalam kode kami. Anda telah menemukan beberapa pengecualian yang tidak dicentang:
  • ArithmeticException terjadi saat membagi dengan nol
  • ArrayIndexOutOfBoundsException terjadi saat Anda mencoba mengakses posisi di luar larik.
Tentu saja, Anda dapat membayangkan bahwa pembuat Java dapat memperkenalkan penanganan pengecualian wajib, tetapi dalam hal ini kodenya akan terlalu rumit. Untuk operasi pembagian apa pun, apakah Anda harus menulis try-catchblok untuk memeriksa apakah Anda secara tidak sengaja membaginya dengan nol? Setiap kali Anda mengakses array, Anda harus menulis try-catchblok untuk memeriksa apakah indeks Anda di luar batas. Semuanya akan menjadi kode spageti dan sama sekali tidak dapat dibaca. Masuk akal jika ide ini ditinggalkan. Akibatnya, pengecualian yang tidak dicentang tidak perlu ditangani dalam try-catchblok atau dilempar ulang (walaupun secara teknis hal ini dimungkinkan, seperti Error).

Cara membuang pengecualian Anda sendiri

Tentu saja, pembuat Java tidak dapat meramalkan setiap situasi luar biasa yang mungkin muncul dalam program. Ada terlalu banyak program di dunia, dan terlalu beragam. Namun hal ini tidak perlu dikhawatirkan, karena Anda dapat membuat pengecualian sendiri, jika perlu. Ini sangat mudah dilakukan. Yang harus Anda lakukan adalah membuat kelas Anda sendiri. Anda harus yakin namanya diakhiri dengan "Pengecualian". Kompiler tidak memerlukan ini, tetapi pemrogram lain yang membaca kode Anda akan segera memahami bahwa ini adalah kelas pengecualian. Selain itu, tunjukkan bahwa kelas tersebut diwarisi dari Exceptionkelas tersebut (kompiler memang memerlukan ini). Sebagai contoh, misalkan kita memiliki Dogkelas. Kita bisa mengajak anjing jalan-jalan menggunakanwalk()metode. Namun sebelum melakukan itu, kita perlu memeriksa apakah pet kita memakai collar, leash, dan muzzle. Jika salah satu dari perlengkapan ini hilang, kita membuang pengecualian kita sendiri: DogIsNotReadyException . Kodenya terlihat seperti ini:

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Untuk menunjukkan bahwa kelas tersebut adalah pengecualian, Anda perlu menulis " extends Exception " setelah nama kelas (ini berarti "kelas tersebut berasal dari kelas Pengecualian"). Dalam konstruktor, kita cukup memanggil Exceptionkonstruktor kelas dengan pesan String (jika pengecualian terjadi, kita akan menampilkan pesan, deskripsi kesalahan, kepada pengguna). Begini tampilannya dalam kode kelas kita:

public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;


   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("We're getting ready for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hooray, let's go for a walk! " + name + " is very happy!");
   } else {
       throw new DogIsNotReadyException(name + " is not ready for a walk! Check the gear!");
   }
 }

}
Sekarang walk()metode kami melempar DogIsNotReadyException . Ini dilakukan dengan melempar kata kunci. Seperti yang kami katakan sebelumnya, pengecualian adalah objek. Jadi, ketika pengecualian terjadi (anjing kehilangan sesuatu) dalam metode kami, kami membuat DogIsNotReadyExceptionobjek baru dan membuangnya menggunakan kata kunci lempar. Kami menambahkan " throws DogIsNotReadyException " ke deklarasi metode. Dengan kata lain, sekarang kompiler menyadari bahwa memanggil walk()metode dapat berubah menjadi situasi yang luar biasa. Dengan demikian, pengecualian ini harus ditangani jika kita memanggil metode ini di suatu tempat di program kita. Mari kita coba lakukan ini dengan main()metode:

public static void main(String[] args) {
  
   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
Ini tidak akan dikompilasi. Pengecualian tidak ditangani! Kami membungkus kode kami dalam satu try-catchblok untuk menangani pengecualian:

public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking the gear! Is the collar on? " + dog.isCollarPutOn + "\r\n Is the leash on? "
       + dog.isLeashPutOn + "\r\n Is the muzzle on? " + dog.isMuzzlePutOn);
   }
}
Sekarang mari kita lihat keluaran konsol: Kerahnya aktif! Moncongnya menyala! Kami sedang bersiap-siap untuk jalan-jalan! Sobat belum siap jalan-jalan! Periksa perlengkapannya! Memeriksa persneling! Apakah kerahnya terpasang? benar Apakah talinya terpasang? salah Apakah moncongnya menyala? benar Lihatlah betapa lebih informatif keluaran konsol itu! Kami melihat setiap langkah yang diambil dalam program; kami melihat di mana kesalahan terjadi, dan kami juga dapat langsung melihat dengan tepat apa yang hilang dari anjing kami. :) Dan begitulah cara Anda membuat pengecualian sendiri. Seperti yang Anda lihat, tidak ada yang rumit tentang itu. Dan meskipun pencipta Java tidak repot-repot memasukkan bahasa pengecualian khusus untuk anjing yang tidak dilengkapi dengan baik, kami telah memperbaiki pengawasan mereka. :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION