Весь код Java працює в контексті потоку . Зв'язаний JavaDoc пояснює критерії обробки помилок та критерії виходу, але ось суть цього:
- JVM відкручується і готує середовище виконання.
- JVM створює потік, який запустить
main()
метод, використовуючи будь-які параметри командного рядка.
- JVM встановлює за замовчуванням обробку виключень за замовчуванням, яка друкує виняток до стандартної помилки та припиняється.
- JVM виконує нитку.
У випадку невиконання виключення, програма фактично гине за третім вище пунктом. Ця поведінка додатково визначена в специфікації мови Java, розділ 11.3
додаткова інформація
Інші згадували статичні блоки та способи їх виконання main()
. Однак для правильного розуміння цього потрібно трохи більше пояснень.
Під час завантаження класу завантажувач класів повинен ініціалізувати всі static final
стани та запустити всі static
блоки, перш ніж клас може бути використаний, включити екземпляри екземплярів класу (вбік: створити клас Java, де константа класу ініціалізується в статичний блок після створення екземпляр класу, і конструктор посилається на константу. Бум!). Однак це все відбувається в логіці завантажувача класів, перш ніж будь-який код може посилатися на клас . Крім того, клас завантажується в будь-який потік, на який посилається клас.
Що це означає, якщо клас, що містить main()
посилання іншого класу (наприклад, константа класу), тоді цей клас повинен бути завантажений перед main()
виконанням, щоб включити його статичні блоки. В іншому випадку статичні блоки виконуються, як зазначено вище. Якщо клас не може завантажити, то клас, що містить main()
, також не вдасться завантажити і програма припиниться.
Ще один FYI: статичні блоки можуть кинути. Errors
кидаються як є. Exceptions
заборонені (помилка часу компіляції). RuntimeExceptions
загортаються у ExceptionInInitializerError . Вони обробляються за оброблювачем виняткових ситуацій, яке, як правило, або знищує потік, або додаток (основний потік), якщо ви ретельно не загортаєте посилання класу (і завантажуєте) у try
- catch
.