Страхувайте се от грешки, но не ги пишете на Java! Вероятно вече знаете някои неща за изключенията в Java . Днес поне повърхностните познания ще ви бъдат от полза. Ще анализираме класа Error и специален тип изключение, което плаши много хора, когато се появи в техните следи на стека.

На върха на йерархията на изключенията на Java е класът Throwable , който има два наследника:

  • Изключение , което е отговорно за грешките във вашата програма.
  • И нашият герой за днес — Error , който е отговорен за грешките в JVM.
    Струва си да се спомене, че това вероятно дори не са грешки в codeирането, а по-скоро проблеми, които обикновено не зависят от разработчика.

Какво да правим с грешка

Когато улавяте "грешки", не можете да извършвате ниHowви действия в catch блока, освен регистриране , тъй като говорим за проблеми в самата JVM.

Регистрирането е добро: когато получите грешка по време на изпълнение, можете да погледнете регистрационните файлове, да видите причината и да знаете Howво да поправите.

Тъй като не знаете Howъв вид грешка може да получите, когато пишете своя code, няма смисъл да пишете конкретен тип в блока catch . Използването на самия клас Error също не е най-доброто решение, тъй като в този случай ще уловите само грешки.

Съответно, по-добре е да използвате класа Throwable , който може да прихваща Howто Error , така и Exception . Как изглежда това на практика?

Не е добре да пишете code по този начин:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Писането на code като този също не е добре:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Но code като този е ОК:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

Втората опция за обработка на грешки е да ги хвърлите по-високо, след като декларирате клауза за хвърляния на метода. Тази техника се използва, когато вашият code теоретично може да изведе грешка и искате да предупредите всички, които биха могли да използват вашия code, така че да могат да се справят правилно с грешката.

Често срещани грешки

Някои от най-популярните грешки са класовете OutOfMemoryError и StackOverflowError .

OutOfMemoryError често се появява, когато програмата няма достатъчно памет за създаване на обекти и събирачът на отпадъци не може да се справи. Резултатът е OutOfMemoryError .

Java не ви позволява ръчно да изтривате обекти, за да предотвратите изтичане на памет, но можете да избегнете изхвърлянето, за да не претоварвате събирача на отпадъци и да не претрупвате купчината.

Например code като този ще създаде много боклук в паметта:


while (true) {
    new Object();
}

Втората грешка, за която искам да ви кажа, е StackOverflowError , която се хвърля, когато стекът препълва. Тъй като стекът съхранява главно локални променливи, параметри и извиквания на методи, рекурсията (or рекурсивно извикване на метод) е много честа причина за тази грешка:


public void foo() {
    foo();
}

За да избегнат проблеми по време на изпълнение на програмата, съвременните IDE често предупреждават за рекурсивно извикване на методи.

Не можете да коригирате програма, която извежда грешки , но можете да напишете code, който няма да изведе грешка и да счупи вашата програма. Гледайте Howво правите с паметта, създавайте обекти внимателно и извиквайте методите правилно. Ако направите това, тогава ще имате по-малко проблеми във вашия code.

Разлика между типовете грешка и изключение

Грешка Изключение
Не може да се коригира в catch block Може да се обработва в блок за улавяне
Не се появява по време на компorране Може да бъде уловен по време на компorране
Проблеми в JVM Проблеми в логиката на codeа
Всички грешки не са отметнати проверени и непроверени

Не можете да избегнете изключенията в Java, но не трябва да се страхувате от тях. Просто трябва да разберете Howво представлява всеки тип и да знаете How да боравите с него. Това е всичко за днес! Ще се видим!