JavaRush /Java Blog /Random-ID /Pengecualian: dicentang, tidak dicentang, dan milik Anda ...

Pengecualian: dicentang, tidak dicentang, dan milik Anda sendiri

Dipublikasikan di grup Random-ID
Halo! Dalam kuliah terakhir, kita mengenal aspek bahasa Java sebagai pengecualian dan melihat contoh cara bekerja dengannya. Hari ini kita akan melihat lebih dalam strukturnya, dan juga mempelajari cara menulis pengecualian kita sendiri :)

Jenis pengecualian

Seperti yang kami katakan, ada banyak kelas pengecualian di Java, hampir 400! Namun semuanya dibagi menjadi beberapa kelompok, sehingga cukup mudah untuk mengingatnya. Begini tampilannya: Pengecualian: dicentang, tidak dicentang, dan milik Anda sendiri - 2Semua pengecualian memiliki kelas leluhur yang sama Throwable. Dua kelompok besar berasal darinya - pengecualian (Exception) dan kesalahan (Error). Kesalahan adalah kesalahan kritis selama eksekusi program yang terkait dengan pengoperasian mesin virtual Java. Dalam kebanyakan kasus, Kesalahan tidak perlu ditangani, karena ini menunjukkan beberapa kelemahan serius dalam kode. Kesalahan yang paling terkenal: StackOverflowError- terjadi, misalnya, ketika suatu metode memanggil dirinya sendiri tanpa henti, dan OutOfMemoryError- terjadi ketika tidak ada cukup memori untuk membuat objek baru. Seperti yang Anda lihat, dalam situasi ini, sering kali tidak ada sesuatu yang istimewa untuk diproses - kodenya ditulis salah dan perlu diulang. Pengecualian sebenarnya adalah pengecualian: situasi luar biasa dan tidak terencana yang terjadi saat program sedang berjalan. Ini bukanlah kesalahan yang seserius Error, namun memerlukan perhatian kita. Semua pengecualian dibagi menjadi 2 jenis - dicentang ( dicentang ) dan tidak dicentang ( tidak dicentang ). Pengecualian: dicentang, tidak dicentang, dan milik Anda sendiri - 3Semua pengecualian yang dicentang berasal dari Exception. Apa yang dimaksud dengan “dapat diverifikasi”? Kami telah menyebutkan sebagian hal ini dalam kuliah terakhir : “...kompiler Java mengetahui tentang pengecualian yang paling umum, dan mengetahui dalam situasi apa pengecualian tersebut dapat terjadi.” Misalnya, dia mengetahui bahwa jika seorang programmer membaca data dari suatu file dalam bentuk kode, situasi dapat dengan mudah muncul bahwa file tersebut tidak ada. Dan ada banyak situasi seperti itu yang bisa dia prediksi sebelumnya. Oleh karena itu, kompiler memeriksa kode kita terlebih dahulu untuk kemungkinan pengecualian. Jika ia menemukannya, ia tidak akan mengkompilasi kodenya hingga kami memprosesnya atau meneruskannya ke atas. Jenis pengecualian kedua adalah “tidak dicentang”. Mereka berasal dari kelas RuntimeException. Apa bedanya dengan yang diuji? Tampaknya ada juga sekelompok kelas berbeda yang berasal dari RuntimeExceptiondan menjelaskan pengecualian waktu proses tertentu. Perbedaannya adalah kompiler tidak mengharapkan kesalahan ini. Dia sepertinya berkata: “Pada saat menulis kode, saya tidak menemukan sesuatu yang mencurigakan, tetapi ada yang tidak beres saat kode itu berfungsi. Rupanya ada kesalahan dalam kodenya!” Dan memang benar. Pengecualian yang tidak dicentang sering kali disebabkan oleh kesalahan pemrogram. Dan kompiler jelas tidak dapat menyediakan semua kemungkinan situasi salah yang dapat dibuat oleh orang-orang dengan tangan mereka sendiri :) Oleh karena itu, kompiler tidak akan memeriksa penanganan pengecualian tersebut dalam kode kami. Anda telah menemukan beberapa pengecualian yang tidak dicentang:
  • ArithmeticExceptionterjadi bila dibagi nol
  • ArrayIndexOutOfBoundsExceptionTerjadi ketika mencoba mengakses sel di luar array.
Secara teoritis, tentu saja, pencipta Java bisa saja memperkenalkan penanganan wajib atas pengecualian tersebut, tapi apa jadinya kode tersebut? Dengan operasi pembagian bilangan apa pun, Anda harus menulis try-catch untuk memeriksa apakah Anda membagi dengan nol secara tidak sengaja? Setiap kali mengakses array, Anda harus menulis try-catch untuk memeriksa apakah Anda telah melampaui batas ini. Kode apa pun yang ditulis akan menjadi spageti dan sama sekali tidak dapat dibaca. Wajar jika gagasan ini ditinggalkan. Oleh karena itu, pengecualian yang tidak dicentang tidak perlu ditangani di blok coba-tangkap atau dilempar ke atas, meskipun secara teknis hal ini memungkinkan, seperti halnya Error.

Bagaimana cara memberikan pengecualian Anda

Tentu saja, pembuat Java tidak dapat membayangkan semua situasi luar biasa yang mungkin timbul dalam program. Ada terlalu banyak program di dunia, dan programnya terlalu berbeda. Tapi tidak apa-apa, karena Anda bisa membuat pengecualian sendiri jika perlu. Hal ini dilakukan dengan sangat mudah. Yang harus Anda lakukan adalah membuat kelas Anda sendiri. Namanya harus diakhiri dengan “Pengecualian”. Kompiler tidak memerlukan ini, tetapi pemrogram yang membaca kode Anda akan segera memahami bahwa ini adalah kelas pengecualian. Selain itu, Anda perlu menunjukkan bahwa kelas tersebut berasal dari class Exception. Ini sudah diperlukan untuk kompiler dan pengoperasian yang benar. Misalnya, kita memiliki kelas Anjing - Dog. Kita bisa mengajak anjing jalan-jalan menggunakan walk(). Namun sebelum itu, kita perlu memeriksa apakah hewan peliharaan kita memakai kalung, tali pengikat, dan moncong. Jika ada yang hilang, kami akan memberikan pengecualian kami sendiri DogIsNotReadyException. Kodenya akan terlihat seperti ini:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Untuk menunjukkan bahwa suatu kelas adalah pengecualian, Anda perlu menulis extends Exception setelah nama kelas: ini berarti bahwa “kelas tersebut berasal dari kelas Exception.” Di konstruktor, kita cukup memanggil konstruktor kelas Exceptiondengan sebuah baris message- ini akan menampilkan pesan dari sistem kepada pengguna yang menjelaskan kesalahan yang telah terjadi. Ini akan terlihat seperti apa di 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("Let's go for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hurrah, let's go for a walk!" + name + " I am glad!");
   } else {
       throw new DogIsNotReadyException("Dog " + name + "not ready for a walk! Check your gear!");
   }
 }

}
Sekarang metode kami walk()memunculkan pengecualian DogIsNotReadyException. Hal ini dilakukan dengan menggunakan kata kunci throw. Seperti yang kami katakan sebelumnya, pengecualian adalah sebuah objek. Oleh karena itu, dalam metode kami, ketika situasi luar biasa terjadi - ada sesuatu yang hilang pada anjing - kami membuat objek kelas baru DogIsNotReadyExceptiondan memasukkannya ke dalam program menggunakan kata throw. walk()Kami menambahkan lemparan ke tanda tangan metode DogIsNotReadyException. Dengan kata lain, compiler sekarang menyadari bahwa pemanggilan metode walk()dapat mengakibatkan pengecualian. Jadi ketika kita memanggil ini di suatu tempat dalam program, pengecualiannya perlu ditangani. Mari kita coba melakukannya dengan metode main():
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();//Unhandled exception: DogIsNotReadyException
}
Tidak dapat dikompilasi, pengecualian tidak ditangani! Mari kita gabungkan kode kita dalam satu blok try-catchuntuk menangani pengecualian:
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking equipment! Is the collar on?" + dog.isCollarPutOn + "\r\n Is the leash on?"
       + dog.isLeashPutOn + "\r\n Are you wearing a muzzle?" + dog.isMuzzlePutOn);
   }
}
Sekarang mari kita lihat keluaran konsol:

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
Lihat betapa lebih informatifnya keluaran konsol ini! Kami melihat setiap langkah yang terjadi dalam program ini; Kami melihat di mana kesalahan terjadi dan segera menyadari apa sebenarnya yang hilang dari anjing kami :) Inilah cara kami membuat pengecualian sendiri. Seperti yang Anda lihat, tidak ada yang rumit. Dan meskipun pengembang Java tidak repot-repot menambahkan pengecualian khusus pada bahasa mereka untuk anjing yang perlengkapannya tidak tepat, kami memperbaiki kesalahan mereka :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION