Проверено изключение срещу изключение по време на работа
Изключение са специални видове събития, които могат да нарушат нормалния поток на програмата. Името изключение идва от „изключително събитие“. Хвърлянето на изключение е процесът на създаване на обект на изключение и предаването му на системата за изпълнение. Когато системата за изпълнение получава обект на изключение, той ще се опита да намери някой, който да се справи с него в стека на повикването, като го пресича в обратен ред (в който методите са били извикани). Системата за изпълнение е успешна, ако намери метод с обработчик на изключения. Манипулаторът на изключенията е блок от код, който може официално да обработва споменатото изключение. Ако системата за изпълнение намери подходящ манипулатор, тя ще предаде обекта на изключение на обработващия. Това се нарича улавяне на изключението. Ако обаче изключението не може да бъде обработено, програмата ще бъде прекратена. В Java изключенията наследяват от клас Throwable. Проверените изключения са изключения, при които обработката се налага от компилатора. Изключенията по време на изпълнение са вид изключения, които не се проверяват от компилатора.
Какво е проверено изключение?
Проверените изключения са или обекти от клас java.lang.exception, или негови подкласове (с изключение на java.lang.RuntimeException и неговите подкласове). Проверените изключения се „проверяват“ по време на компилиране. Това означава, че програмистът трябва или да хване или хвърли тези изключения, или в противен случай компилацията ще се оплаче (причинявайки грешка в компилатора). Поради тази причина много проверени изключения са много добре известни на програмистите. Например, IOException и неговите подкласове са проверени изключения и всеки път, когато програмистът се занимава с достъп или промяна на файл, компилаторът проверява, че всички възможни IOExceptions се грижат от програмиста.
Какво е изключение по време на изпълнение?
Изключенията по време на изпълнение се състоят от java.lang.RuntimeException и всички негови подкласове. Теоретично казано, те обслужват същата цел като проверените изключения и могат да бъдат хвърлени или обработвани като проверено изключение, но обработката на тях не се налага от компилатора. Следователно изключенията по време на изпълнение принадлежат към семейството на непроверени изключения. NullPointerException, NumberFormatEception, ClassCastException и ArrayIndexOutOfBoundsException са често срещани изключения по време на изпълнение на Java.
Каква е разликата между проверено изключение и изключение по време на изпълнение?
Въпреки че, както проверените изключения, така и изключенията по време на изпълнение са нежелано явление по време на изпълнение на програма, те имат своите разлики. Провереното обработка на изключения се налага от компилатора, но изключенията по време на изпълнение не са. Следователно проверените изключения трябва да бъдат хвърлени или обработвани, за да може кодът да се компилира, но няма такова изискване по отношение на изключенията по време на изпълнение. Следователно изключенията по време на изпълнение принадлежат към категорията на непроверени изключения, заедно с грешки.
Недостатък на проверените изключения е, че програмистът трябва да се справи, дори ако не знае как да го направи. Така че, ако програмистът просто хвърли ново изключение, без да обвива оригинала, следата на стека, принадлежаща към първоначалното изключение, ще бъде загубена. Именно тук са полезни изключенията по време на работа. Тъй като всички изключения по време на изпълнение могат да се обработват на едно място, като по този начин програмистите могат да напишат по-малко количество код. От друга страна, тъй като трябва да се хванат проверени изключения, няма изненада за програмиста. Тя винаги ще знае кое проверено изключение може да бъде хвърлено по определен метод. Противно на това, различни изключения по време на изпълнение могат да се хвърлят без знанието на програмиста.