Error

All lectures for UZ purposes
Daraja, Dars
Mavjud

Error-лардан қўрқсанг – джавада ёза олмайсан! Балки сен Java-даги исключениялар ҳақида нимадир биласан. Бугун шунчаки юзаки билим ҳам сенга керак бўлади: биз Error класини ва о'ша "қўрқувчи" исключения турини кўриб чиқамиз, улар кўпинча Stack trace-да пайдо бўлади.

Java-да исключения иерархиясининг тепасида Throwable класи турибди, унинг икки та вориси бор:

  • Exception, у тизимдаги хато учун жавоб беради.
  • Ва бизнинг бугунги қаҳрамонимиз — Error, у JVM хатолари учун жавоб беради.
    Айтишим керакки, бу кўпроқ хатолар эмас, балки муаммолар, улар одатда ишлаб чиқарувчига боғлиқ эмас.

Error-лар билан нима қилиш керак

"Эррорларни" тутсангиз ҳам, catch блокида амаллар бажаришдан ташқари, логларни олишдан ташқари, сизга имкон бўлмайди, чунки бу JVM муаммолари.

Лог олиш — яхши иш: дастурни ишлатиш пайтида хатолик бўлса, сиз логларга қараб, муаммо сабабини кўра оласиз ва қандай тўғрилашни билишингиз мумкин.

Сиз қандай error олишингизни билмаганингиз учун, кодингизда қайси error турини олдиндан танлаб catch блокига ёзишнинг маъноси йўқ. Error класини ишлатиш ҳам йўлдир, лекин бундай ҳолда сиз фақат хатоларни тутишингиз мумкин бўлади.

Шунинг учун Throwable класини ишлатиш яхшироқ, у Error ва Exception туридаги исключенияларни тутиб олиш имконини беради. Бу амалда қандай кўриниши мумкин?

Бундай ёзиш — ОК эмас:

try {
    //Сизнинг кодингиз
} catch (OutOfMemoryError outOfMemoryError) {
    //OutOfMemoryError-ни тутиш коди
}
Бундай ёзиш — ҳам ОК эмас:

try {
    //Сизнинг кодингиз
} catch (Error error) {
    //Барча Errorларни тутиш коди
}
Мана бундай ёзиш — ОК:

try {
    //Сизнинг кодингиз
} catch (Throwable throwable) {
    //Барча Throwableларни тутиш коди
}

Error-ларни парвариш қилишнинг иккинчи варианти — уларни кейинга пробрасывание қилиш, throws калит сўзи ёрдамида метод даражасида. Бу усул сизда кодда қўйилгани қандайдир error тури пайдо бўлиши мумкин бўлганда ишлатилади, ва сиз бундан фойдаланишни хоҳлайсиз, то шуни билиб алохида ечим қилиши мумкин.

Кенг тарқалган error-лар

Энг машҳур error-лардан бири — OutOfMemoryError ва StackOverflowError класслари.

OutOfMemoryError кўпинча бўлади, объектларни яратишга жой етмаганида, ахлат йиғувчи ишлаб чиқара олмаганда, ва натижада OutOfMemoryError бўлади.

Java да сиз объектларни ўчиришни бошқаролмайсиз, хотира чиқишларни олдини олиш учун, лекин сиз ахлат йиғувчига қўшимча иш бериб, heap (кучини) тозалашдан сақланиш мумкин.

Масалан, бундай код хотирада кўп ахлат яратади:


while (true) {
    new Object();
}

Иккинчи хато, StackOverflowError: бу стек тўлганда чақирилади. Стек асосан локал ўзгарувчилар, параметрлар ва метод чақирувларини сақлайди, бунинг кенг тарқалган сабаби рекурсия ёки методнинг рекурсив чақирилиши:


public void foo() {
    foo();
}

Замонавий IDE-лар одатда методларнинг рекурсив чақирилишини кўрсатади, шу билан дастурнинг иш вақтида муаммолардан қочишга имконият яратади.

Сиз Error туридаги исключенияни олмоқчи бўлган дастурни тузатолмайсиз, лекин сиз шундай код ёзишингиз мумкинки, унинг натижасида хато чиқмасдан дастур бузилмаслигини таъминлар. Шунчаки хотира билан масъулятли бўлинг, объектларни эҳтиёткорлик билан яратинг ва методларни тўғри чақиринг, шунда кодда камроқ муаммо бўлади.

Error ва Exception туридаги исключениялар ўртасидаги фарқ

Error Exception
Кечиктирув асосида catch блокида тузатиб бўлмайди catch блокида тузатилиши мумкин
Компиляция вақтида пайдо бўлмайди Компиляция вақтида тутиш мумкин
JVM муаммолари Код мантиғи муаммолари
Барча Error unchecked checked ва unchecked

Java-да исключениясиз бўлмайди, лекин улардан қўрқиш керак эмас. Шунчаки ҳар бир тур нима ифодалашини тушуниш ва уларни қандай ишлашни билиш керак. Бугунча шу. Кўришамиз!

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION