CodeGym /Java курс /Java Multithreading /Стекът на повикванията и прихващането на грешки

Стекът на повикванията и прихващането на грешки

Java Multithreading
Ниво , Урок
На разположение

„Здравей, Амиго!

— Искам да ви разкажа за нещо малко, но интересно.

"Слушам. Обичам неща, които са малки и интересни."

„Е, знаете, че всеки обект Thread има метод run(). И че можете да го изпълните в отделна нишка, като използвате метода start().“

"Да разбира се."

„Но сега си представете тази ситуация: стартирате нишка, за да извършите няHowва работа, но се хвърля изключение и нишката спира да работи, защото не знае Howво да прави. Не трябва ли да знаете за тази грешка по няHowъв начин?“

„Съгласен съм. Трябва по няHowъв начин да уловя изключението, което се е случило в другата работеща нишка. Java поддържа ли изобщо това?“

— Ти ме обиждаш. Разбира се, че е така.

„Създателите на Java изобретиха специален интерфейс, наречен UncaughtExceptionHandler. Ето How да хванете и обработите изключение, което възниква в друга нишка, ако тази нишка не го улови:“

Пример
public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

"Обектът Thread има специален метод setUncaughtExceptionHandler . Трябва да му предадете обект, който имплементира интерфейса Thread.UncaughtExceptionHandler . Този интерфейс има само един метод: uncaughtException(Thread t, Throwable e) . Това е методът, който ще бъде извикан на предавания обект, ако се появи неуловено изключение в метода за изпълнение."

"В моя пример по-горе, аз просто декларирам анонимен вътрешен клас (маркиран в червено), който имплементира интерфейса Thread. Thread.UncaughtExceptionHandler . И замествам неговия uncaughtException(Thread t, Throwable e) метод."

„Както можете да видите от списъка с параметри на метода, ще бъдат предадени два аргумента: препратка към обекта Thread, където е възникнало изключението, и самото изключение, предадено като Throwable e.“

„Е, защо ми е необходима променливата Thread t? Не знаем ли вече в коя нишка поставяме обект Thread.UncaughtExceptionHandler ?“

„Те направиха това, за да можете да напишете универсален манипулатор за тези ситуации, т.е. можете да създадете един обект и да го предадете на десетки различни нишки. След това методът uncaughtException( Thread t, Throwable e) винаги ви дава препратка към Обект на нишка, където е възникнало изключението."

"Нещо повече, можете да създадете десетки нишки, например, в цикъл, за да изпълнявате специфични задачи. Като цяло, тази препратка към обекта Thread няма да е излишна. Обещавам ви го."

— Вярвам ти. Никога не си грешил.

Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION