1. Jinis pangecualian

Kabeh pangecualian dipérang dadi 4 jinis, sing sejatine minangka kelas sing diwarisake.

Throwablekelas

Kelas dhasar kanggo kabeh pengecualian yaiku Throwablekelas. Kelas Throwablengemot kode sing nulis tumpukan telpon saiki (tumpukan tilak saka cara saiki) kanggo Uploaded. Kita bakal sinau apa tilak tumpukan sethitik mengko.

Operator uncalan mung bisa nampa obyek sing asalé saka Throwablekelas. Lan sanajan sampeyan kanthi teori bisa nulis kode kaya throw new Throwable();, biasane ora ana sing nindakake iki. Tujuan utama Throwablekelas kasebut yaiku duwe kelas induk tunggal kanggo kabeh pengecualian.

Errorkelas

Kelas pangecualian sabanjure yaiku Errorkelas, sing langsung marisi Throwablekelas kasebut. Mesin Java nggawe obyek saka Errorkelas (lan turunane) nalika ana masalah serius . Contone, malfunction hardware, memori ora cukup, etc.

Biasane, minangka programmer, sampeyan ora bisa nindakake apa-apa ing kahanan sing ana kesalahan (jenis sing Errorkudu dibuwang) ing program: kesalahan kasebut serius banget. Sampeyan mung bisa menehi kabar marang pangguna yen program nabrak lan / utawa nulis kabeh informasi sing dikenal babagan kesalahan kasebut menyang log program.

Exceptionkelas

Kelas Exceptionlan RuntimeExceptionkanggo kesalahan umum sing kedadeyan ing operasi akeh metode. Sasaran saben pangecualian sing dibuwang yaiku kejiret blok catchsing ngerti cara nangani kanthi bener.

Nalika cara ora bisa ngrampungake karya kanggo sawetara alesan, iku kudu langsung ngabari cara nelpon dening mbuwang pangecualian saka jinis cocok.

Ing tembung liyane, yen variabel padha karo null, cara bakal uncalan a NullPointerException. Yen argumen sing salah diterusake menyang metode kasebut, bakal mbuwang InvalidArgumentException. Yen cara sengaja dibagi dening nul, iku bakal uncalan ArithmeticException.

RuntimeExceptionkelas

RuntimeExceptionsminangka subset saka Exceptions. Kita malah bisa ngomong sing RuntimeExceptionversi entheng saka pangecualian biasa ( Exception) — luwih sithik syarat lan watesan sing dileksanakake kanggo pangecualian kasebut

Sampeyan bakal sinau beda antarane Exceptionlan RuntimeExceptionmengko.


2.: Throwsdicenthang pangecualian

Kabeh pangecualian Jawa kalebu 2 kategori: dicenthang lan ora dicenthang .

Kabeh pangecualian sing marisi RuntimeExceptionutawa Errordianggep minangka pangecualian sing ora dicenthang . Kabeh liyane wis dicenthang pangecualian .

Penting!

Rong puluh taun sawisé dicenthang pangecualian, meh saben programer Jawa nganggep iki minangka bug. Ing kerangka modern sing populer, 95% kabeh pangecualian ora dicenthang. Basa C#, sing meh nyalin Jawa persis, ora nambah pangecualian sing dicenthang .

Apa prabédan utama antarane pangecualian sing dicenthang lan sing ora dicenthang ?

Ana syarat tambahan sing ditrapake kanggo pengecualian sing dicenthang . Secara kasar, yaiku:

Syarat 1

Yen cara mbuwang pangecualian sing dicenthang , kudu nuduhake jinis pangecualian ing tandhane . Mangkono, saben cara sing nyebutake ngerti manawa "pengecualian sing migunani" iki bisa kedadeyan.

Nuduhake pangecualian sing dicenthang sawise paramèter metode sawise throwstembung kunci (aja throwsalah nggunakake tembung kunci). Iku katon kaya iki:

type method (parameters) throws exception

Tuladha:

dicenthang pangecualian pangecualian sing ora dicenthang
public void calculate(int n) throws Exception
{
   if (n == 0)
      throw new Exception("n is null!");
}
public void calculate(n)
{
   if (n == 0)
      throw new RuntimeException("n is null!");
}

Ing conto ing sisih tengen, kode kita mbuwang pengecualian sing ora dicenthang - ora ana tindakan tambahan sing dibutuhake. Ing conto ing sisih kiwa, metode kasebut mbuwang pengecualian sing wis dicenthang , mula throwstembung kunci ditambahake menyang tandha metode bebarengan karo jinis pengecualian kasebut.

Yen cara ngarepake mbuwang pirang-pirang pangecualian sing dicenthang , kabeh kasebut kudu ditemtokake sawise throwstembung kunci, dipisahake karo koma. Urutan ora penting. Tuladha:

public void calculate(int n) throws Exception, IOException
{
   if (n == 0)
      throw new Exception("n is null!");
   if (n == 1)
      throw new IOException("n is 1");
}

Syarat 2

Yen sampeyan nelpon cara sing wis dicenthang pangecualian ing teken, sampeyan ora bisa nglirwakake kasunyatan sing mbalang wong.

Sampeyan kudu nyekel kabeh pangecualian kasebut kanthi nambahake catchblok kanggo saben siji, utawa nambahake menyang throwsklausa kanggo metode sampeyan.

Kaya-kaya kita ngomong, " Istiméwa iki penting banget supaya kita kudu nyekel wong-wong mau. Lan yen kita ora ngerti carane nangani, banjur sapa wae sing nelpon cara kita kudu diwenehi kabar yen pengecualian kasebut bisa kedadeyan.

Tuladha:

Bayangake yen kita nulis cara kanggo nggawe jagad sing diisi manungsa. Nomer awal wong diterusake minangka argumentasi. Dadi kita kudu nambah pangecualian yen ana sawetara wong.

Nggawe Bumi Cathetan
public void createWorld(int n) throws EmptyWorldException, LonelyWorldException
{
   if (n == 0)
      throw new EmptyWorldException("There are no people!");
   if (n == 1)
      throw new LonelyWorldException ("There aren't enough people!");
   System.out.println("A wonderful world was created. Population: " + n);
}
Cara kasebut bisa nggawe rong pengecualian sing dicenthang :

  • EmptyWorldException
  • LonelyWorldException

Telpon metode iki bisa ditangani kanthi 3 cara:

1. Aja nyekel sembarang istiméwa

Iki paling asring ditindakake nalika metode kasebut ora ngerti cara nangani kahanan kasebut kanthi bener.

Kode Cathetan
public void createPopulatedWorld(int population)
throws EmptyWorldException, LonelyWorldException
{
   createWorld(population);
}
Cara nelpon ora nyekel pangecualian lan kudu menehi informasi marang wong liya babagan iki: nambahake menyang throwsklausa dhewe

2. Nyekel sawetara pangecualian

Kita nangani kesalahan sing bisa ditangani. Nanging sing kita ora ngerti, kita uncalan menyang cara nelpon. Kanggo nindakake iki, kita kudu nambah jenenge menyang klausa throws:

Kode Cathetan
public void createNonEmptyWorld(int population)
throws EmptyWorldException
{
   try
   {
      createWorld(population);
   }
   catch (LonelyWorldException e)
   {
      e.printStackTrace();
   }
}
Panelpon nyekel mung siji pangecualian dicenthangLonelyWorldException - . Pangecualian liyane kudu ditambahake menyang teken, nuduhake sawise throwstembung kunci

3. Nyekel kabeh istiméwa

Yen cara ora mbuwang pangecualian kanggo cara nelpon, banjur cara nelpon tansah manteb ing ati sing kabeh bisa uga. Lan ora bakal bisa tumindak kanggo ndandani kahanan sing luar biasa.

Kode Cathetan
public void createAnyWorld(int population)
{
   try
   {
      createWorld(population);
   }
   catch (LonelyWorldException e)
   {
      e.printStackTrace();
   }
   catch (EmptyWorldException e)
   {
      e.printStackTrace();
   }
}
Kabeh pangecualian kejiret ing cara iki. Sing nelpon bakal manteb ing ati yen kabeh wis apik.


3. Nyekel kaping istiméwa

Programer tenan sengit kanggo duplikat kode. Malah padha teka karo prinsip pembangunan sing cocog - KERING : Aja Baleni dhewe. Nanging nalika nangani pangecualian, asring ana trysawetara pamblokiran catchkanthi kode sing padha.

Utawa bisa uga ana 3 catchblok kanthi kode sing padha lan 2 catchblok liyane kanthi kode sing padha. Iki minangka kahanan standar nalika proyek sampeyan nangani pengecualian kanthi tanggung jawab.

Diwiwiti karo versi 7, ing basa Jawa nambahake kemampuan kanggo nemtokake macem-macem jinis pengecualian ing catchblok siji. Kira-kira katon kaya iki:

try
{
   // Code where an exception might occur
}
catch (ExceptionType1 | ExceptionType2 | ExceptionType3 name)
{
   // Exception handling code
}

Sampeyan bisa duwe minangka akeh catchpamblokiran sing pengin. Nanging, blok siji catchora bisa nemtokake pangecualian sing bisa marisi siji liyane. Ing tembung liyane, sampeyan ora bisa nulis catch ( Exception| RuntimeExceptione), amarga RuntimeExceptionkelas warisan Exception.