1. Jinis pangecualian

Jinis pangecualian

Kabeh pangecualian dipérang dadi 4 jinis, yaiku kelas sing saling marisi.

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 bisa nulis kode kanthi teoritis kaya throw new Throwable();, biasane ora ana sing nindakake iki. Tujuan utama kelas Throwableyaiku 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

Throws: dicenthang 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. Pengecualian bungkus

Pangecualian sing dicenthang katon keren ing teori, nanging dadi frustasi gedhe ing praktik.

Upaminipun sampeyan duwe cara super populer ing project. Disebut saka atusan panggonan ing program sampeyan. Lan sampeyan mutusake kanggo nambah pangecualian sing dicenthang anyar . Lan bisa uga yen pangecualian sing dicenthang iki pancen penting lan khusus, mung main()cara sing ngerti apa sing kudu ditindakake yen kejiret.

Tegese sampeyan kudu nambahake pangecualian sing dicenthang menyang throwsklausa saben metode sing nyebutake metode sing paling populer sampeyan . Uga ing throwsklausa saka kabeh cara sing nyebut metode kasebut. Lan cara-cara sing diarani metode kasebut.

Akibaté, throwsklausa setengah saka metode ing proyek entuk pangecualian sing dicenthang anyar . Lan mesthi proyek sampeyan ditutupi tes, lan saiki tes kasebut ora dikompilasi. Lan saiki sampeyan kudu ngowahi klausa mbuwang ing tes sampeyan uga.

Banjur kabeh kode sampeyan (kabeh owah-owahan ing atusan file) kudu dideleng dening programer liyane. Lan ing wektu iki, kita takon dhewe kenapa kita nggawe akeh owah-owahan getih ing proyek kasebut? Dina (s?) Kerja, lan tes sing rusak - kabeh kanggo nambah siji pengecualian sing dicenthang ?

Lan mesthi, isih ana masalah sing ana gandhengane karo warisan lan overriding metode. Masalah sing teka saka pangecualian sing dicenthang luwih gedhe tinimbang entuk manfaat. Ing ngisor iki yaiku saiki sawetara wong sing tresna lan sawetara wong sing nggunakake.

Nanging isih akeh kode (kalebu kode perpustakaan Jawa standar) sing ngemot pangecualian sing dicenthang iki . Apa sing kudu dilakoni karo wong-wong mau? Kita ora bisa nglirwakake, lan kita ora ngerti carane nangani.

programer Java ngajokaken kanggo mbungkus pengecualian dicenthang ing RuntimeException. Ing tembung liyane, nyekel kabeh pangecualian sing dicenthang banjur nggawe pangecualian sing ora dicenthang (contone, RuntimeException) lan uncalan. Nindakake sing katon kaya iki:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

Iku ora solusi banget cantik, nanging ora ana pidana kene: pangecualian mung diiseni nang a RuntimeException.

Yen dikarepake, sampeyan bisa kanthi gampang njupuk saka ing kono. Tuladha:

Kode Cathetan
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Entuk pangecualian sing disimpen ing njero RuntimeExceptionobyek. Variabel kasebut causebisa null

Nemtokake jinis lan ngowahi dadi jinis pangecualian sing dicenthang .


4. Nyekel kaping istiméwa

Programer tenan sengit kanggo duplikat kode. Malah padha teka karo prinsip pembangunan sing cocog: Aja Ulangi Dhewe (GARING) . 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. Iku 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.



5. pangecualian Custom

Sampeyan bisa tansah nggawe kelas pangecualian dhewe. Sampeyan mung nggawe kelas sing marisi RuntimeExceptionkelas kasebut. Bakal katon kaya iki:

class ClassName extends RuntimeException
{
}

Kita bakal ngrembug rincian nalika sampeyan sinau OOP, warisan, konstruktor, lan metode overriding.

Nanging, sanajan sampeyan mung duwe kelas prasaja kaya iki (tanpa kode), sampeyan isih bisa mbuwang pengecualian adhedhasar:

Kode Cathetan
class Solution
{
   public static void main(String[] args)
   {
      throw new MyException();
   }
}

class MyException extends RuntimeException
{
}




Uncalan sing ora dicenthang MyException .

Ing quest Java Multithreading , kita bakal nyilem jero kanggo nggarap pengecualian khusus kita dhewe.