2015-02-22 3 views
5

Если мы выбрали исключение в методе main и не будем его обрабатывать, он будет работать нормально. На самом делеКто на самом деле обрабатывает исключения, брошенные в основном методе?

public static void main(String[] args) throws IOException { 
    throw new IOException(); //OK 
} 

Но Java требует каких-либо проверяемое исключение будет обработано в программе, поэтому IOException следует обращаться. Кто на самом деле обрабатывает IOException в этом случае?

Обратите внимание, что спецификация языка Java определяет, что исключение обрабатывается, если оно заключено в блок try, содержащий параметр catch, тип которого является супертипом исключения.

+1

@KorayTugay Что? Ваш комментарий кажется абсолютно неконструктивным – user3663882

+2

Downvoters, не могли бы вы объяснить, почему? Я спросил об официальном объяснении JVM working princeples – user3663882

+0

Я удивлен, что этот вопрос был задан только год назад, и никто этого не задавал раньше. Это, безусловно, хороший вопрос. +1 – user3437460

ответ

9

Если вы не предприняли никаких особых действий, чтобы поймать исключение самостоятельно, выполняется ThreadGroup по умолчанию uncaughtException.

Это указано в JLS Chapter 11.3.

Если не найдено предложение catch, которое может обрабатывать исключение, то текущий поток (поток, столкнувшийся с исключением) прекращается. До окончания, все, наконец, пункты выполнены и неперехваченное исключение обрабатывается в соответствии со следующими правилами:

  1. Если текущий поток имеет неперехваченное набор обработчика исключений, то этот обработчик выполняется.

  2. В противном случае для ThreadGroup вызывается метод uncaughtException, который является родительским элементом текущего потока. Если ThreadGroup и его родительский ThreadGroups не переопределяют uncaughtException, , тогда вызывается метод обработчика по умолчанию uncaughtException.

Кроме того, Javadoc из ThreadGroup.uncaughtException гласит:

Вызывается в виртуальной машине Java, когда поток в этой группе потоков останавливается из-за неперехваченное исключение, и поток не имеют установленный Thread.UncaughtExceptionHandler.

uncaughtException метод ThreadGroup выполняет следующие действия:

  • Если эта нить группа имеет родительскую группу потоков, то uncaughtException метод этого родителя вызывается с теми же двумя аргументами.
  • В противном случае этот метод проверяет, установлен ли установленный обработчик исключаемых исключений по умолчанию, и если это так, то его метод uncaughtException вызывается с теми же двумя аргументами.
  • В противном случае этот метод определяет, является ли аргумент Throwable экземпляром ThreadDeath. Если это так, ничего особенного не делается. В противном случае сообщение, содержащее имя потока, возвращаемое из метода потока getName, и обратная трассировка стека, с использованием метода printStackTrace, печатается в стандартный поток ошибок.
+0

Итак, на самом деле, если исключение не попадает в предложение catch, оно все равно будет обрабатываться JVM, вызывающим этот метод. Это все объясняет. – user3663882

+1

Если исключение не попадает в предложение catch, JVM разрешит ThreadGroup потока бросания (т. Е. Поток, который запускает 'main') обрабатывает исключение. – aioobe

+0

Это единственное подробное объяснение, которое можно найти во всем Интернете на Земле. – user3437460

1

JVM сам обрабатывает исключения, сброшенные с main().

+0

Почему вы так думаете? Он упоминается в спецификации Java или спецификации виртуальной машины Java? – user3663882

+0

Я не помню, где это упоминается. Но это своего рода общее знание. – AlexR

+0

Ну, я ищу формальное объяснение этого факта. Чтобы убедиться, что [this] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-11.html#jls-11.3) глава не упоминает об этом. – user3663882

2

Если исключение не перехвачено, то нить или неперехваченное обработчик исключений Нити группы вызывается, а затем поток завершается.

ПСБ chapter 11 утверждает, что:

Если ни один пункт catch, который может обрабатывать исключение не может быть найден, то текущий поток (поток, который встречается исключение) является прекращено. До окончания, все finally положений выполняются и неперехваченного исключения обрабатываются в соответствии со следующими правилами:

Если текущий поток имеет неперехваченное набор обработчика исключений, то этот обработчик выполняется.

В противном случае для ThreadGroup вызывается метод uncaughtException, который является родительским элементом текущего потока. Если ThreadGroup и его родительский ThreadGroup s не переопределяют uncaughtException, тогда вызывается метод uncaughtException обработчика по умолчанию .

Смежные вопросы