Error

All lectures for GE purposes
1 уровень , 33 лекция
Открыта

არ შეგეშინდეს Error-ების – თორემ ვერ დაწერ Java-ზე! ალბათ უკვე იცი რაღაც გამონაკლისების (exceptions) შესახებ Java-ში. დღეს მაინც ზედაპირული ცოდნა გამოგადგება: განვიხილავთ Error კლასს და გამონაკლისების სპეციალურ ტიპს, რომელიც ბევრს "აშინებს", როდესაც მათ Stacktrace-ებში ჩნდება.

გამონაკლისების იერარქიის სათავეში დგას Throwable კლასი, რომელსაც ჰყავს ორი მემკვიდრე:

  • Exception, რომელიც პასუხისმგებელია სისტემურ შეცდომებზე.
  • და ჩვენი დღევანდელი გმირი — Error, რომელიც პასუხს აგებს JVM-ის შეცდომებზე.
    უნდა აღინიშნოს, რომ ეს უფრო პრობლემებია, რომლებსაც, როგორც წესი, დეველოპერი ვერ აკონტროლებს.

რა უნდა ვქნათ Error-ის შემთხვევაში

Error-ების "დაჭერა" და ცდილობა რაიმე მოქმედების შესრულება catch ბლოკში, გარდა ლოგირების, არ გამოგივა, რადგან ეს არის JVM-ის პრობლემა.

ლოგირება კარგია: პროგრამის შესრულების დროს თუ მიიღე შეცდომა, შეგიძლია გადახედო ლოგებს, ნახო პრობლემა და იცოდე, რა უნდა გამოსწორდეს.

რადგან არ იცი, რა 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 ხშირია იმ შემთხვევებში, როდესაც პროგრამას ვერ ეყოფა სივრცე ობიექტების შესაქმნელად, და Garbage Collector ვერ ასწრებს მასზე მოქმედებას, შედეგი კი არის OutOfMemoryError.

Java-ში ობიექტების წაშლის კონტროლი არ შეგიძლია, მაგრამ შეგიძლია არ შექმნა ზედმეტი ნაგავი, რათა Garbage Collector-ს ზედმეტი სამუშაო არ მისცე და heap (ყუთი) არ გაავსო.

მაგალითად, ასეთ ტიპის კოდი ბევრ ნაგავს წარმოქმნის:


while (true) {
    new Object();
}

მეორე შეცდომა, რიჟესაც მინდა მოგიყვეთ, არის StackOverflowError: ჩნდება იმ შემთხვევებში, როდესაც stack-ი ივსება. stack ძირითადად ინახავს ლოკალურ ცვლადებს, პარამეტრებს და მეთოდების გამოძახებებს, და ამასთან ხშირად დაკავშირებულია რეკურსია ან მეთოდის რეკურსიული გამოძახება:


public void foo() {
    foo();
}

თანამედროვე IDE-ები ხშირად აცნობენ რეკურსიულ გამოძახებებს, რათა თავიდან აიცილოს პროგრამის შესრულების პრობლემები.

შეგიძლიათ ვერ მოასწოროთ პროგრამა, რომელმაც გამოიწვია Error-ის ტიპის გამონაკლისები, მაგრამ შეგიძლიათ დაწეროთ კოდი, რომელიც არ გამოიწვევს შეცდომას და არ გაგიფუჭებს პროგრამას. უბრალოდ არ უგულებელყოთ მეხსიერების მართვა, ყურადღებით შექმენით ობიექტები და სწორად გამოძახეთ მეთოდები, და მაშინ შეცდომების რაოდენობა კოდში ნაკლები იქნება.

რას ნიშნავს განსხვავება Error და Exception ტიპის გამონაკლისებს შორის

Error Exception
არ შეიძლება გამოსწორება catch ბლოკში შესაძლებელია დამუშავება catch ბლოკში
არ გამოჩნდება კომპილაციის დროს შესაძლებელია დაჭერა კომპილაციის დროს
JVM-ის პრობლემები კოდის ლოგიკის პრობლემები
ყველა Error unchecked checked და unchecked

გამონაკლისების გარეშე Java-ით ვერ იმუშავებ, მაგრამ ეს არ უნდა აშინებს. უბრალოდ უნდა გვესმოდეს, რომ ყველა ტიპი რაღაცას აღნიშნავს და ვიცოდეთ, როგორ დავუმუშავოთ ისინი. დღეს ეს ყველაფერი იყო. შევხვდებით!

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ