1. Намудҳои истисноҳо
Ҳамаи истисноҳо ба 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
Ҳамаи истисноҳо дар 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-исключение |
---|---|
|
|
Дар мисоли рост коди мо 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
методаи худ илова кунед.
Мо гӯё ба худ мегӯем: ин истисноҳо хеле муҳиманд, ки мо ҳатман бояд онҳоро захвас кунем. Ва агар мо надонем, ки чӣ тавр онҳоро захвас кардан лозим аст, бояд ба касоне, ки методи моро даъват мекунанд, хабар диҳед, ки дар он чунин истисноҳо пайдо шуда метавонанд.
Мисол:
Тасаввур кунед, ки мо методе менависем, ки бояд оламро эҷод кунад, ки бо одамон аҳолӣ дошта бошад. Шумораи ибтидоии одамон ҳамчун параметр дода мешавад. Он гоҳ мо бояд истисноҳо илова кунем, агар одамон хеле кам бошанд.
Замин месозем | Эзоҳ |
---|---|
|
Метод эҳтимолан ду checked-исключение мепартояд: |
- ПустойМир
- ОдинокийМир
Даъвати ин метод мумкин аст ба 3 роҳ коркард карда шавад:
1. Захвас накардани истисноҳое, ки пайдо мешаванд
Аксаран ин дар ҳолатҳое иҷро мешавад, ки дар метод маълум нест, ки чӣ гуна бояд ин ҳолатро дуруст коркард кард.
Код | Эзоҳ |
---|---|
|
Методи даъваткунанда истисноҳоро захвас намекунад ва маҷбур мешавад, ки дигаронро аз онҳо хабар диҳад: илова кардани онҳо дар throws худ |
2. Захвас кардани қисми истисноҳо
Хатоҳои фаҳмидаро коркард мекунем, номуаёнро ба методи даъваткунанда мепартоем. Барои ин лозим аст навиши онҳоро дар throws илова кардан:
Код | Эзоҳ |
---|---|
|
Методи даъваткунанда танҳо як checked-исключениеро захвас мекунад – ОдинокийМир , дуюмашон бояд дар сигнатураи худ илова карда шавад: пас аз калимаи throws ишора кардан |
3. Захвас кардани ҳама истисноҳо
Агар метод истисноҳоеро ба методи даъваткунанда наандозад, методи даъваткунанда ҳамеша итминон хоҳад дошт, ки ҳама чиз хуб анҷом ёфт. Ва барои ислоҳи ҳолат ягон амалро пеш гирифта наметавонад.
Код | Эзоҳ |
---|---|
|
Дар ин метод ҳамаи хатоҳо захвас мешаванд. Методи даъваткунанда итминон хоҳад дошт, ки ҳамааш хуб буд. |
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
мерос гирифта шудааст.
GO TO FULL VERSION