1. Pangecualian

>

Ing pungkasan, programer mikir kanggo nggawe standarisasi lan ngotomatisasi penanganan kesalahan. Iki kedadeyan nalika pangecualian diciptakake. Saiki mekanisme pangecualian nangani 80% kahanan sing luar biasa.

Yen sawetara sarjana teka karo pangecualian, iku kamungkinan subyek disertasi doktoral dheweke. Yen programmer teka munggah karo, banjur bisa uga wis ditampa pat loropaken ing mburi saka coworker: "Koyone oke, bro."

Nalika ana kesalahan ing program Jawa, kayata divisi dening 0, sawetara kedadeyan sing apik banget:

Langkah siji

Objek pangecualian khusus digawe, sing ngemot informasi babagan kesalahan sing kedadeyan.

Kabèh ing Jawa iku sawijining obyek, lan pangecualian ora pangecualian 🙂 Obyek pangecualian duwe kelas dhewe, lan mung bab sing mbedakake saka kelas biasa iku padha oleh warisan kelas Throwable.

Langkah loro

Objek pangecualian yaiku "dibuwang". Mbok menawa tembung ing kene bisa luwih apik. "Mbuwang pangecualian" luwih kaya micu weker geni utawa muni tandha "DEFCON 1".

Nalika pangecualian dibuwang menyang mesin Java, operasi normal program mandheg lan "protokol darurat" diwiwiti.

Langkah telu

Cara sing dibuwang pengecualian langsung metu. Pangecualian diterusake menyang cara nelpon, sing uga langsung metu. Lan sateruse mudhun rantai nganti maincara metu. Nalika maincara mungkasi, uga program kasebut.

Tuladha:

Kode Output 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

Pangecualian dumadi ing baris 20: divisi dening 0. Mesin Jawa langsung nggawe pangecualian - ArithmeticExceptionobyek lan "mbuwang" menyang cara.

Cara divide()ends langsung, supaya kita tau weruh senar: Boten elek kedaden: 0. Program bali menyang endTheWorld()cara, lan kahanan mbaleni dhewe: ana pangecualian unhandled ing sistem, kang tegese cara endTheWorld()uga terminates abnormally. Banjur maincara mandheg, lan program mandheg.

Apa tujuane pengecualian kasebut? Ya, sampeyan bisa nulis kode dhewe kanggo nyekel jinis pengecualian tartamtu lan nulis logika sampeyan dhewe kanggo nangani kahanan sing luar biasa.


2. Pengecualian nyekel:try-catch

Jawa nduweni mekanisme pangecualian sing ngidini sampeyan mungkasi cara sing ora normal iki. Katon kaya iki:

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

Konstruksi iki diarani try-catchblok.

Kode ing ngendi pangecualian bisa kedadeyan dibungkus nganggo kurung kriting, didhisiki tembung try.

Sawise kurung kriting, kita duwe catchtembung kunci lan, ing jero kurung, deklarasi variabel pangecualian . Iki diterusake karo kurung kriting sing mbungkus kode sing bakal dieksekusi yen ana pangecualian saka jinis sing ditemtokake .

Yen ora ana pangecualian sing dibuwang sajrone eksekusi " kode utama ", banjur kode ing blok tangkapan ora bakal dieksekusi. Yen ana pangecualian, mula bakal dadi (yen jinis pengecualian sing dibuwang padha karo jinis variabel ing kurung).

Tuladha:

Kode Output 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. Multiple catchpamblokiran

Multiple nyekel pamblokiran

Ing teori, kabeh jinis pangecualian bisa dibuwang ing blok kode. Sawetara sampeyan pengin nangani kanthi cara siji, liyane kanthi cara liya, lan liyane sampeyan bakal mutusake ora bakal ditangani.

Pangembang Jawa mutusake kanggo nulungi sampeyan lan ngidini sampeyan nulis ora mung siji nanging akeh catchblok sawise tryblok kasebut.

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
}

Tuladha:

Kode Output 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 catchpamblokiran

Pangecualian sing dumadi ing tryblok mung bisa kejiret dening catchblok siji. Sampeyan ora bisa duwe kahanan pangecualian ing ngendi kode saka pirang-pirang catchblok dieksekusi.

Nanging urutan pamblokiran penting.

Sampeyan bisa duwe kahanan ing ngendi pangecualian bisa kejiret dening pirang-pirang blok. Yen ngono, pangecualian bakal kejiret dening blok apa wae sing luwih dhisik (paling cedhak karo tryblok).

Carane sampeyan bisa duwe kahanan ing ngendi sawetara pamblokiran nyekel bisa nyekel pangecualian padha?

Kabeh pangecualian kalebu ing hirarki warisan siji - deleng diagram.

Hierarki pangecualian

Obyek ArithmeticExceptionbisa ditugasake menyang variabel sing jinis ArithmeticExceptionutawa kelas leluhure: RuntimeException , Exceptionlan Throwable- ndeleng diagram.

Kita bakal ngomong luwih akeh babagan kelas warisan lan leluhur ing Level 21.

Kode iki bakal dikompilasi kanthi apik:

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

Supaya sampeyan bisa nyekel ArithmeticExceptionkaro salah siji saka 4 catchpamblokiran ndhuwur.

Tuladha 1:

Kode Output 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

Ing conto iki, ArithmeticExceptionbisa kejiret dening loro catch (Exception e)lan catch (ArithmeticException e)pamblokiran. Bakal kejiret dening blok sing paling cedhak karo tryblok - blok pertama catch.

Kanggo ngindhari kejutan, luwih becik nyelehake catchblok sing bisa nyekel meh kabeh pangecualian ing mburi dhaptar catchblok.

Jinis iki Throwableumume bisa nyekel saben pangecualian sing bisa ditindakake ing Jawa . Yen dilebokake ing catchblok pisanan, kode kasebut ora bakal dikompilasi, amarga kompiler ngerti yen ana blok kode sing ora bisa digayuh.