JavaRush /Курсхо /All lectures for TG purposes /Намудҳои истисноҳо

Намудҳои истисноҳо

All lectures for TG purposes
Сатҳи , Дарс
дастрас

1. Намудҳои истисноҳо

Намудҳои истисноҳо дар Java

Ҳамаи истисноҳо ба 4 намуд тақсим мешаванд, ки воқеан синфҳое мебошанд, ки аз якдигар мерос гирифтаанд.

Синфи Throwable

Базавитарин синф барои ҳама истисноҳо синфи Throwable аст. Дар синфи Throwable коди ҳастӣ, ки стек-трейсҳои ҳозираи даъватҳои функсияро ба як массив сабт мекунад. Чӣ гуна стек-трейсҳои даъватҳоро маълум хоҳем кард каме дертар.

Ба оператори throw танҳо объекти синфи-меросгирифта Throwable дода мешавад. Ва гарчанде ки теоретикӣ мумкин аст кодеро навишт, ки монанд ба throw new Throwable(); бошад — умумиан касе чунин намекунад. Ҳадафи асосии вуҷудияти синфи Throwable — синфи ягона барои ҳама истисноҳо мебошад.

Синфи Error

Синфи навбатии истисноҳо ин синфи Error мебошад — меросгири мустақими синфи Throwable. Объектҳои намуди Error (ва синфҳои меросгирифтаи он) Java-мошина ҳангоми ягон мушкили ҷиддӣ месозанд. Масалан, вайроншавии кор, норасоии хотира ва ғайра.

Одатан шумо ҳамчун барномасоз ҳеҷ чиз карда наметавонед дар ҳолате, ки дар барнома хатои намуди Error рух медиҳад: чунин хато хеле ҷиддӣ аст. Ҳамаи он чизе, ки шумо карда метавонед — истеъмолгарро огоҳ кардан аст, ки барнома бо садама қатъ мешавад ё тамоми маълумоти маълуми хаторо ба лог программы сабт кунед.

Синфи Exception

Истисноҳои намуди Exception (ва RuntimeException) ин хатоҳои оддӣ мебошанд, ки дар вақти кори бисёр методаҳо пайдо мешаванд. Ҳадафи ҳар як истиснои партофташуда — захвас кардани он блоки catch мебошад, ки медонад, ки дар ин ҳолат чӣ кор кардан лозим аст.

Ҳангоме ки ягон метод бо сабаби ягон сабаб наметавонад кори худро иҷро кунад, бояд фавран инро ба методи даъваткунанда хабар диҳад, истиснои мувофиқро партофтан.

Дигаргунае, агар ягон тағйирёбанда баробар ба null бошад, метод истиснои NullPointerException партофта мешавад, агар ба метод аргументҳои нодуруст дода шаванд — истиснои InvalidArgumentException партофта мешавад, агар дар метод тасодуфан ба ноль тақсимшавӣ ба вуҷуд ояд — ArithmeticException.

Синфи RuntimeException

RuntimeException — ин намуде (зермаҷмӯа) аз истисноҳои Exception мебошад. Ҳатто мумкин аст гуфт, ки RuntimeException — ин версияи сабуктари истисноҳои маъмулии (Exception) аст: ба чунин истисноҳо талабот ва маҳдудиятҳо камтар мерасанд.

Дар бораи фарқияти Exception ва RuntimeException шумо баъдтар мефаҳмед.


2. Истисноҳои санҷидашуда: throws, checked exceptions

Истисноҳои санҷидашуда: throws, checked exceptions

Ҳамаи истисноҳо дар Java ба 2 категория — санҷидашуда (checked) ва насанҷидашуда (unchecked) тақсим мешаванд.

Ҳамаи истисноҳо, ки аз синфҳои RuntimeException ва Error мерос гирифта шудаанд, ҳамчун unchecked-исключения ҳисобида мешаванд, ҳамаи дигар — checked-исключения.

Муҳим!

Пас аз 20 сол аз ворид намудани истисноҳои санҷидашуда, қариб ҳама Java-барномасозон инро ҳамчун хато ҳисоб мекунанд. 95% ҳамаи истисноҳо дар чаҳорчӯбаҳои муосири маъмули — насанҷидашаванда. Ҳамон забони C#, ки қариб пурра Java-ро нусхабардорӣ кард, санҷишҳои checked-исключения илова накардааст.

Чӣ фарқияти асосии checked-исключения аз unchecked?

Ба checked-исключения талаботҳои иловагӣ мавҷуданд. Онҳо тақрибан чунин садо медиҳанд.

Талаботи 1

Агар метод checked-исключениями партофта шавад, он бояд намуди ин истиснороҳатро дар сарлавҳаи худ дошта бошад (сигнатураи метод). Ҳамаи методҳо, ки ин методро даъват мекунанд, бояд донанд, ки чунин истиснои "муҳим" дар он пайдо шуда метавонад.

Ишораи checked-исключения бояд пас аз параметрҳои метода пас аз калимаи калиди throws шаванд (бо throw омезиш накунед). Ин тақрибан чунин менамояд:

type метод (параметрҳо) throws истисно

Мисол:

checked-исключение unchecked-исключение
public void calculate(int n) throws Exception
{
   if (n == 0)
      throw new Exception("n баробар ба нол аст!");
}
public void calculate(n)
{    if (n == 0)
      throw new RuntimeException("n баробар ба нол аст!");
}

Дар мисоли рост коди мо unchecked-исключение баромадааст — амалҳои иловагӣ лозим нест. Дар мисоли чап метод checked-исключение баромадааст, бинобар ин ба сигнатураи метода калимаи калиди throws ва намуди истисно илова шудаанд.

Агар метод ба нақша гирифта шавад, ки якчанд checked-исключения, ҳамаашонро бояд пас аз калимаи калиди throws тавассути вергул ишора кунед. Тартиб муҳим нест. Мисол:

public void calculate(int n) throws Exception, IOException
{
   if (n == 0)
      throw new Exception("n баробар ба нол аст!");
   if (n == 1)
      throw new IOException("n баробар ба як");
}

Талаботи 2

Агар шумо методеро даъват мекунед, ки дар сигнатураи он checked-исключения навишта шудааст, пас шумо наметавонед ин фактро нописанд кунед.

Шумо бояд ё ҳамаи ин истисноро захвас кунед, бо илова намудани блокҳои catch барои ҳар яке аз онҳо, ё онҳоро дар throws методаи худ илова кунед.

Мо гӯё ба худ мегӯем: ин истисноҳо хеле муҳиманд, ки мо ҳатман бояд онҳоро захвас кунем. Ва агар мо надонем, ки чӣ тавр онҳоро захвас кардан лозим аст, бояд ба касоне, ки методи моро даъват мекунанд, хабар диҳед, ки дар он чунин истисноҳо пайдо шуда метавонанд.

Мисол:

Тасаввур кунед, ки мо методе менависем, ки бояд оламро эҷод кунад, ки бо одамон аҳолӣ дошта бошад. Шумораи ибтидоии одамон ҳамчун параметр дода мешавад. Он гоҳ мо бояд истисноҳо илова кунем, агар одамон хеле кам бошанд.

Замин месозем Эзоҳ
public void эҷодиДунё(int n) throws ПустойМир,ОдинокийМир
{
   if (n == 0)
      throw new ПустойМир("Люди умуман нестанд!");
   if (n == 1)
      throw new ОдинокийМир("Бисёр кам миқдор одамон ҳаст!");
   System.out.println("Дунёи олиҷаноб сохта шуд. Аҳолӣ: " + n);
}
Метод эҳтимолан ду checked-исключение мепартояд:

  • ПустойМир
  • ОдинокийМир

Даъвати ин метод мумкин аст ба 3 роҳ коркард карда шавад:

1. Захвас накардани истисноҳое, ки пайдо мешаванд

Аксаран ин дар ҳолатҳое иҷро мешавад, ки дар метод маълум нест, ки чӣ гуна бояд ин ҳолатро дуруст коркард кард.

Код Эзоҳ
public void эҷодиАҳолӣДунё(int population)
throws ПустойМир, ОдинокийМир
{
   эҷодиДунё(population);
}
Методи даъваткунанда истисноҳоро захвас намекунад ва маҷбур мешавад, ки дигаронро аз онҳо хабар диҳад: илова кардани онҳо дар throws худ

2. Захвас кардани қисми истисноҳо

Хатоҳои фаҳмидаро коркард мекунем, номуаёнро ба методи даъваткунанда мепартоем. Барои ин лозим аст навиши онҳоро дар throws илова кардан:

Код Эзоҳ
public void эҷодиДунёиНопусто(int population)
throws ПустойМир
{
   try
   {
      эҷодиДунё(population);
   }
   catch (ОдинокийМир e)
   {
      e.printStackTrace();
   }
}
Методи даъваткунанда танҳо як checked-исключениеро захвас мекунад – ОдинокийМир, дуюмашон бояд дар сигнатураи худ илова карда шавад: пас аз калимаи throws ишора кардан

3. Захвас кардани ҳама истисноҳо

Агар метод истисноҳоеро ба методи даъваткунанда наандозад, методи даъваткунанда ҳамеша итминон хоҳад дошт, ки ҳама чиз хуб анҷом ёфт. Ва барои ислоҳи ҳолат ягон амалро пеш гирифта наметавонад.

Код Эзоҳ
public void эҷодиҲарДунё(int population)
{
   try
   {
      эҷодиДунё(population);
   }
   catch(ОдинокийМир e)
   {
      e.printStackTrace();
   }
   catch(ПустойМир e)
   {
      e.printStackTrace();
   }
}
Дар ин метод ҳамаи хатоҳо захвас мешаванд. Методи даъваткунанда итминон хоҳад дошт, ки ҳамааш хуб буд.


3. Захвас кардани истисноҳои сершумор

Барномасозон такрори кодро бисёр дӯст намедоранд. Ҳатто як принсипи таҳияро ихтироъ карданд — DRY: Don’t Repeat Yourself. Аммо дар коркарди истисноҳо аксаран ҳолатҳое пайдо мешаванд, ки пас аз блоки try якчанд блокҳои catch бо кодҳои якхела меоянд.

Ё мумкин аст, масалан, 3 блоки catch бо як код ва боз 2 блоки catch бо кодҳои дигар. Ин ҳолати стандартӣ аст, вақте ки дар лоиҳаи шумо ба захвас кардани истисноҳо ҷиддан муносибат мекунанд.

Аз версияи 7, ба забони Java имконияти ишораи якчанд намудҳои истисноҳо дар як блоки catch илова карда шуд. Ин тақрибан чунин менамояд:

try
{
   коде, ки хатогӣ дошта метавонад
}
catch(ТипИсключения1 | ТипИсключения2 | ТипИсключения3 ном)
{
   код барои коркарди истисноҳо
}

Блокҳои catch метавонанд чандто бошанд. Аммо дар як блоки catch наметавон истисноҳое, ки аз якдигар мерос гирифта шуданд, ишора кард. Яъне наметавон навишт catch (Exception | RuntimeException e), зеро синфи RuntimeException аз Exception мерос гирифта шудааст.



Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION