Tất cả các mã Java chạy trong ngữ cảnh của một luồng . JavaDoc được liên kết giải thích các tiêu chí xử lý và thoát lỗi, nhưng đây là ý chính của nó:
- JVM tự quay tròn và chuẩn bị môi trường thực thi.
- JVM tạo ra một luồng sẽ chạy
main()
phương thức bằng cách sử dụng bất kỳ tham số dòng lệnh nào được áp dụng.
- JVM thiết lập một trình xử lý ngoại lệ chưa được mặc định in ra ngoại lệ cho lỗi tiêu chuẩn và chấm dứt.
- JVM thực thi luồng.
Trong trường hợp ngoại lệ chưa được phát hiện, chương trình sẽ thực sự chết theo mục thứ ba ở trên. Hành vi này được chỉ định thêm trong Đặc tả ngôn ngữ Java, Phần 11.3
thông tin bổ sung
Những người khác đã đề cập đến các khối tĩnh và cách họ thực hiện trước đó main()
. Tuy nhiên, điều này đòi hỏi một chút giải thích để hiểu chính xác.
Khi tải một lớp, trình nạp lớp phải khởi tạo tất cả static final
trạng thái và chạy tất cả static
các khối trước khi lớp có thể được sử dụng, để bao gồm các thể hiện khởi tạo của lớp (sang một bên: tạo một lớp Java trong đó hằng số lớp được khởi tạo trong một khối tĩnh sau khi tạo thể hiện của lớp và hàm tạo tham chiếu hằng số. Boom!). Tuy nhiên, tất cả điều này xảy ra trong logic trình nạp lớp trước khi bất kỳ mã nào có thể tham chiếu lớp . Hơn nữa, lớp được tải trong bất kỳ chủ đề nào tham chiếu lớp.
Điều này có nghĩa là nếu lớp chứa main()
tham chiếu một lớp khác (ví dụ: hằng lớp) thì lớp đó phải được tải trước khi main()
thực thi để bao gồm các khối tĩnh của nó. Mặt khác, các khối tĩnh được thực hiện như trên. Nếu lớp không tải, thì lớp chứa main()
cũng sẽ không tải và chương trình sẽ kết thúc.
Một FYI khác: khối tĩnh có thể ném. Errors
được ném như vốn có. Exceptions
bị cấm (lỗi thời gian biên dịch). RuntimeExceptions
được gói trong ExceptionInitializerError . Chúng được xử lý theo trình xử lý ngoại lệ chưa được xử lý, thông thường sẽ giết luồng hoặc ứng dụng (luồng chính) trừ khi bạn cẩn thận bọc tham chiếu lớp (và tải) trong một try
- catch
.