Если мы создадим исключение в методе main
и не обработаем его, оно будет работать нормально. Фактически
public static void main(String[] args) throws IOException {
throw new IOException(); //OK
}
Но Java требует, чтобы любое проверенное исключение обрабатывалось в программе, поэтому следует обрабатывать IOException
. Кто на самом деле обрабатывает IOException в этом случае?
Обратите внимание, что спецификация языка Java определяет, что исключение обрабатывается, если оно заключено в блок try, содержащий предложение catch
, тип которого является супертипом исключения.
3 ответа
Если вы не предприняли никаких специальных действий, чтобы самостоятельно поймать исключение, выполняется ThreadGroup
по умолчанию uncaughtException
.
Это указано в главе 11.3 JLS а>.
Если не удается найти предложение catch, которое может обрабатывать исключение, текущий поток (поток, обнаруживший исключение) завершается. Перед завершением все предложения finally выполняются, а неперехваченное исключение обрабатывается в соответствии со следующими правилами:
Если текущий поток имеет установленный обработчик неперехваченных исключений, то этот обработчик выполняется.
В противном случае метод
uncaughtException
вызывается дляThreadGroup
, который является родителем текущего потока. ЕслиThreadGroup
и его родительскийThreadGroups
не переопределяютuncaughtException
, тогда вызывается метод обработчика по умолчаниюuncaughtException
.
Кроме того, javadoc ThreadGroup.uncaughtException
читается следующим образом:
Вызывается виртуальной машиной Java, когда поток в этой группе потоков останавливается из-за неперехваченного исключения, и для потока не установлен конкретный
Thread.UncaughtExceptionHandler
.Метод
uncaughtException
объектаThreadGroup
выполняет следующие действия:
- Если эта группа потоков имеет родительскую группу потоков, метод
uncaughtException
этого родительского потока вызывается с теми же двумя аргументами.- В противном случае этот метод проверяет, установлен ли обработчик неперехваченных исключений по умолчанию, и если да, то его метод
uncaughtException
вызывается с теми же двумя аргументами.- В противном случае этот метод определяет, является ли аргумент
Throwable
экземпляромThreadDeath
. Если да, то ничего особенного не делается. В противном случае сообщение, содержащее имя потока, возвращенное из метода потокаgetName
, и трассировку стека, используя методprintStackTrace
Throwable
, печатается в стандартный поток ошибок.
Сама JVM обрабатывает исключения, генерируемые из main()
.
Если исключение не перехвачено, вызывается обработчик неперехваченных исключений потока или группы потоков, а затем поток завершается.
В главе 11 JLS говорится который:
Если не найдено ни одного предложения
catch
, которое может обрабатывать исключение, то текущий поток (поток, обнаруживший исключение) прекращено. Перед прекращением действия все условияfinally
выполняются и неперехваченное исключение обрабатывается в соответствии со следующими правилами:Если текущий поток имеет установленный обработчик неперехваченных исключений, то этот обработчик выполняется.
В противном случае метод
uncaughtException
вызывается дляThreadGroup
, который является родителем текущего потока. ЕслиThreadGroup
и его родительскиеThreadGroup
не отменяютuncaughtException
, затем метод обработчика по умолчаниюuncaughtException
вызывается.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.