Весь код Java выполняется в контексте потока . Связанный JavaDoc объясняет критерии обработки ошибок и выхода, но вот суть этого:
- JVM раскручивается и подготавливает среду исполнения.
- JVM создает поток, который будет запускать
main()
метод с использованием любых параметров командной строки.
- JVM устанавливает обработчик необработанных исключений по умолчанию, который печатает исключение со стандартной ошибкой и завершает работу.
- JVM выполняет поток.
В случае невыясненного исключения программа фактически умирает согласно третьему пункту выше. Это поведение дополнительно определено в Спецификации языка Java, Раздел 11.3
Дополнительная информация
Другие упоминали статические блоки и как они выполняются раньше main()
. Тем не менее, это требует немного большего объяснения, чтобы понять правильно.
При загрузке класса загрузчик класса должен инициализировать все static final
состояния и запустить все static
блоки перед использованием класса, чтобы включить создание экземпляров класса (кроме: создайте класс Java, где константа класса инициализируется в статическом блоке после создания экземпляр класса, а конструктор ссылается на константу. Бум!). Однако все это происходит в логике загрузчика классов, прежде чем любой код может ссылаться на класс . Кроме того, класс загружается в любом потоке, на который ссылается класс.
Это означает, что если класс, содержащий main()
ссылки, ссылается на другой класс (например, константа класса), то этот класс должен быть загружен перед выполнением, main()
чтобы включить его статические блоки. В противном случае статические блоки выполняются, как указано выше. Если класс не загружается, то содержащий его класс main()
также не загружается, и программа завершается.
Еще одно замечание: статические блоки могут бросать. Errors
брошены как есть. Exceptions
запрещены (ошибка времени компиляции). RuntimeExceptions
обернуты в ExceptionInInitializerError . Они обрабатываются с помощью обработчика неперехваченных исключений, который обычно либо уничтожает поток, либо приложение (основной поток), если вы не аккуратно заключите ссылку на класс (и загрузку) в try
- catch
.