Подробная блок-схема полной обработки необработанных исключений приведена здесь: Как обрабатываются необработанные исключения в Java .
При возникновении необработанного исключения JVM выполняет следующие действия:
- вызывает специальный закрытый метод
dispatchUncaughtException()
для класса Thread
, в котором происходит исключение;
- [... который] вызывает метод потока
getUncaughtExceptionHandler()
, чтобы найти подходящий обработчик необработанных исключений для использования. Обычно это будет родительский поток ThreadGroup
, чей метод handleException()
по умолчанию выведет трассировку стека.
- затем завершает поток, в котором произошло исключение.
Поэтому вы можете, если хотите, создать свой собственный обработчик необработанных исключений.
Следует также отметить, что хотя main
обычно используется в качестве точки входа в приложение Java, метод аналогичен любым другим методам в том, что его можно также вызывать из других контекстов (например, других main
методов, или даже сам по себе рекурсивно!). В этом случае вызывающая сторона может ловить сгенерированные исключения.
public class SelfCatch {
public static void main(String args[]) throws Exception {
if (args == null) throw new Exception("Hi there!");
try {
main(null);
} catch (Exception e) {
System.out.println("Caught: " + e);
}
System.out.println("Exiting...");
}
}
Выход:
Caught: java.lang.Exception: Hi there!
Exiting...