Cały kod Java działa w kontekście wątku . Połączony JavaDoc wyjaśnia obsługę błędów i kryteria wyjścia, ale oto ich sedno:
- JVM uruchamia się i przygotowuje środowisko wykonawcze.
- JVM tworzy wątek, który uruchomi
main()
metodę przy użyciu dowolnych parametrów wiersza poleceń.
- JVM ustawia domyślną procedurę przechwytywania wyjątków, która drukuje wyjątki na błąd standardowy i kończy działanie.
- JVM wykonuje wątek.
W przypadku niewyłapanego wyjątku program skutecznie umiera zgodnie z trzecim punktem powyżej. To zachowanie jest bardziej szczegółowo określone w specyfikacji języka Java, sekcja 11.3
dodatkowe informacje
Inni wspominali o blokach statycznych i ich wcześniejszym działaniu main()
. Wymaga to jednak nieco więcej wyjaśnień, aby poprawnie zrozumieć.
Podczas ładowania klasy moduł ładujący klasy musi zainicjować wszystkie static final
stany i uruchomić wszystkie static
bloki, zanim będzie można użyć klasy, aby uwzględnić wystąpienia instancji klasy (na bok: utwórz klasę Java, w której stała klasy jest inicjowana w bloku statycznym po utworzeniu wystąpienie klasy, a konstruktor odwołuje się do stałej. Boom!). Wszystko to dzieje się jednak w logice modułu ładującego klasy, zanim jakikolwiek kod będzie mógł odwoływać się do klasy . Ponadto klasa jest ładowana do dowolnego wątku, do którego się ona odnosi.
Oznacza to, że jeśli klasa zawierająca main()
odwołania odwołuje się do innej klasy (np. Stała klasy), to klasa ta musi zostać załadowana przed main()
wykonaniem w celu włączenia bloków statycznych. W przeciwnym razie bloki statyczne są wykonywane jak wyżej. Jeśli klasa się nie załaduje, wówczas klasa zawierająca main()
również nie załaduje się, a program zakończy działanie.
Kolejna informacja: bloki statyczne mogą rzucać. Errors
są rzucane takimi, jakimi są. Exceptions
są zabronione (błąd czasu kompilacji). RuntimeExceptions
są opakowane w ExceptionInInitializerError . Są one obsługiwane przez nieprzechwyconą procedurę obsługi wyjątków, która zazwyczaj albo zabije wątek, albo aplikację (główny wątek), chyba że ostrożnie zawiniesz odwołanie do klasy (i załadujesz) w try
- catch
.