[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-proiskhodit-kogda-v-potoke-vybrasyvaetsya-isklyuchenie":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},263,"chto-proiskhodit-kogda-v-potoke-vybrasyvaetsya-isklyuchenie",8,"mnogopotochnost","Многопоточность","🔀","Что происходит, когда в потоке выбрасывается исключение?","\u003C!-- grade: 3\u002F5 — основные моменты есть, но нет примера кода и недостаточно деталей -->\n\nПоведение зависит от того, перехвачено ли исключение внутри потока.\n\n### Если исключение перехвачено (caught)\n\nПоток продолжает работу -- ничего особенного не происходит. Стандартная обработка исключений Java.\n\n### Если исключение не перехвачено (uncaught)\n\nПроисходит следующая последовательность:\n\n1. Поток **завершается** (переходит в состояние `TERMINATED`).\n2. JVM вызывает **обработчик непойманных исключений** (`UncaughtExceptionHandler`).\n3. Если обработчик не установлен -- стек-трейс выводится в `System.err`.\n4. **Другие потоки продолжают работу** -- исключение в одном потоке не останавливает остальные потоки и JVM (если только это не единственный пользовательский поток).\n\n### Иерархия поиска UncaughtExceptionHandler\n\nJVM ищет обработчик в следующем порядке:\n\n1. **Обработчик конкретного потока:** `thread.getUncaughtExceptionHandler()`\n2. **Обработчик группы потоков:** `thread.getThreadGroup().uncaughtException()`\n3. **Обработчик по умолчанию:** `Thread.getDefaultUncaughtExceptionHandler()`\n4. Если ни один не установлен -- стек-трейс печатается в `System.err`\n\n### Установка обработчиков\n\n\u003Cdetails>\n\u003Csummary>Пример: установка UncaughtExceptionHandler\u003C\u002Fsummary>\n\n```java\npublic class UncaughtExceptionDemo {\n    public static void main(String[] args) throws InterruptedException {\n        \u002F\u002F Обработчик по умолчанию для ВСЕХ потоков\n        Thread.setDefaultUncaughtExceptionHandler((t, e) ->\n            System.err.println(\"[DEFAULT] Поток \" + t.getName()\n                + \" упал: \" + e.getMessage()));\n\n        \u002F\u002F Обработчик для конкретного потока\n        Thread worker = new Thread(() -> {\n            throw new RuntimeException(\"Что-то пошло не так!\");\n        }, \"worker-1\");\n\n        worker.setUncaughtExceptionHandler((t, e) ->\n            System.err.println(\"[THREAD] Поток \" + t.getName()\n                + \" упал: \" + e.getMessage()));\n\n        worker.start();\n        worker.join();\n\n        \u002F\u002F Поток без персонального обработчика\n        Thread worker2 = new Thread(() -> {\n            throw new ArithmeticException(\"Деление на ноль\");\n        }, \"worker-2\");\n\n        worker2.start();\n        \u002F\u002F Сработает обработчик по умолчанию\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Особые случаи\n\n| Ситуация | Поведение |\n|---|---|\n| Исключение в пуле потоков (`execute()`) | Поток завершается, создаётся новый. `UncaughtExceptionHandler` вызывается |\n| Исключение в пуле потоков (`submit()`) | Исключение **не выводится** -- оно сохраняется в `Future`. Вызов `future.get()` выбросит `ExecutionException` |\n| `OutOfMemoryError` | Поток завершается. JVM может продолжить работу, если оставшимся потокам хватает памяти |\n| `StackOverflowError` | Поток завершается. Другие потоки не затрагиваются |\n\n### Практическая рекомендация\n\nВсегда устанавливайте `defaultUncaughtExceptionHandler` для логирования:\n\n```java\nThread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {\n    logger.error(\"Непойманное исключение в потоке {}\", thread.getName(), throwable);\n    \u002F\u002F Отправить алерт в систему мониторинга\n});\n```\n\n> **Аналогия из жизни.** Непойманное исключение -- это сотрудник, который ушёл с работы не предупредив. Обработчик `UncaughtExceptionHandler` -- это охранник на проходной, который записывает в журнал, кто и почему ушёл. Без охранника никто не узнает, что сотрудник пропал.\n\n> **На собеседовании.** Ключевые моменты: (1) непойманное исключение завершает только **один** поток, не всю JVM; (2) для перехвата таких исключений существует `UncaughtExceptionHandler`; (3) при использовании `ExecutorService.submit()` исключение «прячется» в `Future` и может быть незамеченным -- это частый источник скрытых багов. Хорошая практика -- всегда вызывать `future.get()` или использовать `execute()` для задач, не возвращающих результат.","","middle",[15,16,17,18],"exception","UncaughtExceptionHandler","Thread","concurrency",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":31,"featuredSnippetReady":32},"Исключение в потоке Java — UncaughtExceptionHandler — Gymterview","Непойманное исключение завершает поток (состояние dead). Если установлен UncaughtExceptionHandler, он перехватит исключение перед завершением.","Что происходит при исключении в потоке?","Непойманное исключение убивает поток. UncaughtExceptionHandler позволяет перехватить его и обработать перед завершением потока.",[27,28,29,30],"исключение в потоке Java","UncaughtExceptionHandler Java","непойманное исключение поток","thread exception handler","Если исключение не поймано — поток переходит в состояние dead. Если установлен UncaughtExceptionHandler, JVM вызовет его метод uncaughtException(), передав поток и исключение как аргументы.",true]