1. Pengecualian

>

Akhirnya, pemrogram berpikir untuk membakukan dan mengotomatiskan penanganan kesalahan. Ini terjadi ketika pengecualian ditemukan. Sekarang mekanisme pengecualian menangani 80% situasi luar biasa.

Jika beberapa sarjana muncul dengan pengecualian, kemungkinan itu adalah subjek dari disertasi doktoralnya. Jika seorang programmer datang dengan itu, maka dia mungkin telah menerima tepukan ramah dari seorang rekan kerja: "Sepertinya baik-baik saja, bro."

Saat terjadi kesalahan dalam program Java, seperti pembagian dengan 0, beberapa hal menakjubkan terjadi:

Langkah pertama

Objek pengecualian khusus dibuat, yang berisi informasi tentang kesalahan yang terjadi.

Segala sesuatu di Jawa adalah objek, dan pengecualian bukanlah pengecualian 🙂 Objek pengecualian memiliki kelasnya sendiri, dan satu-satunya hal yang membedakannya dari kelas biasa adalah bahwa mereka mewarisi kelas tersebut Throwable.

Langkah kedua

Objek pengecualian "dilempar". Mungkin kata-kata di sini bisa lebih baik. "Melempar pengecualian" lebih seperti memicu alarm kebakaran atau membunyikan peringatan "DEFCON 1".

Ketika pengecualian dilemparkan ke mesin Java, operasi normal dari program berhenti dan "protokol darurat" dimulai.

Langkah ketiga

Metode di mana pengecualian dilemparkan segera keluar. Pengecualian diteruskan ke metode pemanggilan, yang juga segera keluar. Dan seterusnya sampai mainmetode keluar. Ketika mainmetode berakhir, begitu pula programnya.

Contoh:

Kode Keluaran konsol
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Your attention, please! Preparing for the end of the world");
      endTheWorld();
      System.out.println("The world ended successfully");
   }

   public static void endTheWorld()
   {
      System.out.println("We're doing something important");
      doSomeWork(0);
      System.out.println("Everything is working well");
   }

   public static void doSomeWork(int n)
   {
      System.out.println("Nothing terrible will happen: " + n);
      System.out.println(2 / n);
      System.out.println("Nothing terrible happened: " + n);
   }
}
Your attention, please! Preparing for the end of the world
We're doing something important
Nothing terrible will happen: 0

Pengecualian terjadi pada baris 20: pembagian dengan 0. Mesin Java segera membuat pengecualianArithmeticExceptionobjek dan "melempar" ke metode.

Metode divide()segera berakhir, jadi kita tidak pernah melihat string: Tidak ada hal buruk yang terjadi: 0. Program kembali ke metode endTheWorld(), dan situasi berulang: ada pengecualian yang tidak tertangani dalam sistem, yang berarti bahwa metode endTheWorld()juga berhenti secara tidak normal. Kemudian mainmetode berakhir, dan program berhenti.

Apa tujuan dari pengecualian ini? Nah, Anda dapat menulis kode Anda sendiri untuk menangkap jenis pengecualian tertentu dan menulis logika Anda sendiri untuk menangani situasi luar biasa.


2. Menangkap pengecualian:try-catch

Java memiliki mekanisme penangkapan pengecualian yang memungkinkan Anda menghentikan penghentian metode yang tidak normal ini. Ini terlihat seperti ini:

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}

Konstruksi ini disebut try-catchblok.

Kode di mana pengecualian dapat terjadi dibungkus dengan kurung kurawal, diawali dengan kata try.

Setelah kurung kurawal, kita memiliki catchkata kunci dan, di dalam tanda kurung, deklarasi variabel pengecualian . Ini diikuti oleh kurung kurawal yang membungkus kode yang akan dieksekusi jika terjadi pengecualian dari jenis yang ditentukan .

Jika tidak ada pengecualian yang dilemparkan selama eksekusi " kode utama ", maka kode di dalam blok catch tidak akan dieksekusi. Jika pengecualian terjadi, maka itu akan menjadi (jika jenis pengecualian yang dilemparkan sama dengan jenis variabel dalam tanda kurung).

Contoh:

Kode Keluaran konsol
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Hadron Collider launched");

      try
      {
         launchHadronCollider(1);
         launchHadronCollider(0);
      }
      catch(Exception e)
      {
         System.out.println("Error! Caught an exception");
         System.out.println("The planet was sucked into a black hole!");
      }

      System.out.println("The Hadron Collider stopped");
   }

   public static void launchHadronCollider(int n)
   {
      System.out.println("Everything is working well: " + n);
      System.out.println(2/n);
      System.out.println("There are no problems: " + n);
   }
}
Hadron Collider launched
Everything is working fine: 1
2
There are no problems: 1
Everything is working fine: 0
Error! Caught an exception
The planet has been sucked into a black hole!
The Hadron Collider is stopped


3. Beberapa catchblok

Beberapa blok tangkapan

Secara teori, segala macam pengecualian dapat dimasukkan ke dalam blok kode. Beberapa ingin Anda tangani dengan satu cara, yang lain dengan cara lain, dan yang lainnya Anda akan memutuskan untuk tidak menangani sama sekali.

Pengembang Java memutuskan untuk membantu Anda dan membiarkan Anda menulis bukan hanya satu tetapi banyak catchblok setelah tryblok.

try
{
   // Code where an exception might occur
}
catch (ExceptionType1 name1)
{
   // Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
   // Code for handling ExceptionType2
}
   catch (ExceptionType3 name3)
{
   // Code for handling ExceptionType3
}

Contoh:

Kode Keluaran konsol
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Start of main method");
      try
      {
         calculate(0);
      }
      catch (ArithmeticException e)
      {
         System.out.println("Division by 0");
      }
      catch(Exception e)
      {
         System.out.println("Caught some kind of exception");
      }

      System.out.println("End of main method");
   }

   public static void calculate(int n)
   {
      System.out.println("Start of calculate method: " + n);
      System.out.println(2/n);
      System.out.println("End of calculate method: " + n);
   }
}
Start of main method
Start of calculate method: 0
Division by 0
End of main method


4. Urutan catchblok

Pengecualian yang terjadi dalam satu tryblok hanya dapat ditangkap oleh satu catchblok. Anda tidak dapat memiliki situasi penanganan pengecualian di mana kode dari banyak catchblok dieksekusi.

Tapi urutan blok itu penting.

Anda dapat memiliki situasi di mana pengecualian dapat ditangkap oleh banyak blok. Jika itu masalahnya, maka pengecualian akan ditangkap oleh blok tangkap mana pun yang lebih dulu (paling dekat dengan tryblok).

Bagaimana Anda bisa mengalami situasi di mana banyak blok tangkapan dapat menangkap pengecualian yang sama?

Semua pengecualian termasuk dalam hierarki pewarisan tunggal — lihat diagram.

Hirarki pengecualian

Sebuah ArithmeticExceptionobjek dapat ditugaskan ke variabel yang tipenya adalah ArithmeticExceptionatau salah satu dari kelas leluhurnya: RuntimeException , Exceptiondan Throwable— lihat diagram.

Kita akan berbicara lebih banyak tentang warisan dan kelas leluhur di Level 21.

Kode ini akan dikompilasi dengan baik:

Manfaat warisan:
ArithmeticException ae    = new ArithmeticException();
RuntimeException runtime  = new ArithmeticException();
Exception exception       = new ArithmeticException();
Throwable trwbl           = new ArithmeticException();

Jadi Anda bisa menangkapnya ArithmeticExceptiondengan salah satu dari 4 catchblok di atas.

Contoh 1:

Kode Keluaran konsol
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Start of main method");
      try
      {
         calculate(0);
      }
      catch(ArithmeticException e)
      {
         System.out.println("Division by 0");
      }
      catch(Exception e)
      {
         System.out.println("Caught some kind of exception");
      }

      System.out.println("End of main method");
   }

   public static void calculate(int n)
   {
      System.out.println("Start of calculate method: " + n);
      System.out.println(2/n);
      System.out.println("End of calculate method: " + n);
   }
}
Start of main method
Start of calculate method: 0
Division by 0
End of main method

Dalam contoh ini, ArithmeticExceptiondapat ditangkap oleh blok catch (Exception e)dan catch (ArithmeticException e). Itu akan ditangkap oleh blok yang paling dekat dengan tryblok — blok pertama catch.

Untuk menghindari kejutan, yang terbaik adalah menempatkan catchblok yang dapat menangkap hampir setiap pengecualian di dekat akhir daftar catchblok.

Jenis Throwableumumnya mampu menangkap setiap kemungkinan pengecualian di Jawa . Jika Anda meletakkannya di catchblok pertama, maka kode tidak akan dikompilasi, karena kompiler mengetahui bahwa ada blok kode yang tidak dapat dijangkau.