2012-10-31 29 views
8

Từ hiểu biết của tôi, throw là lệnh jvm nguyên thủy. Khi điều này được gọi, JVM "kiểm tra xem ngăn xếp cuộc gọi hiện tại có thể bắt được nó không". nếu nó không thể, sau đó java chỉ đơn giản là bật ngăn xếp cuộc gọi gần như chính xác như một sự trở lại được gọi là. sau đó jvm "kiểm tra nếu ngăn xếp cuộc gọi hiện tại có thể bắt nó" và do đó trên đệ quy.Làm thế nào để JVM biết nơi để bắt một ngoại lệ khi chạy?

Câu hỏi của tôi: làm thế nào để thuật toán có thể cho JVM biết vị trí trong ngăn xếp cuộc gọi có thể bắt được một ngoại lệ nhất định? Có siêu dữ liệu được lưu trữ trong mỗi trường hợp ngoại lệ đối chiếu mục nhập ngăn xếp cuộc gọi tới các khối mã không? là có một cấu trúc dữ liệu tĩnh trong đống mà bằng cách nào đó theo dõi này? bởi vì một nơi nào đó phải có dữ liệu theo dõi điều đó.

+1

liên quan: http://stackoverflow.com/questions/10301244/how-is-multi-catch-implemented-in-java-7 – assylias

Trả lời

9

JVM specification có chi tiết về điều này.

Cụ thể, section 4.7.3 cung cấp thông tin chi tiết về bảng ngoại lệ, là một loạt các mục cho biết ngoại lệ nào bị bắt giữa các hướng dẫn nào. Section 3.12 đưa ra một ví dụ cụ thể về điều này.

Cách siêu dữ liệu này được ánh xạ vào mã gốc cho JIT là một vấn đề khác, tất nhiên - và thực hiện cụ thể. Ví dụ, có thể có một số ánh xạ trở lại từ mỗi vị trí lệnh trong mã JITted gốc trở lại vị trí bytecode ban đầu, tại thời điểm đó bảng ngoại lệ có thể được tham khảo để tìm trình xử lý phù hợp.

+0

Rất thú vị :) – Mik378

1

Nói chung: Khi ngoại lệ được ném, JVM sẽ trích xuất "ngăn xếp cuộc gọi". Điều này xác định lệnh bytecode hoặc máy nào đã được thực hiện ở mỗi cấp trong ngăn xếp cuộc gọi, cùng với lớp và phương thức được liên kết với vị trí đó. Sau đó, đối với mỗi phương pháp trong ngăn xếp (bắt đầu với phương thức mà ngoại lệ xảy ra và làm việc ngược), JVM trông (trong đối tượng lớp bên trong) tại phương thức của bảng của phương thức thử/bắt phạm vi đến lệnh bytecode/machine các dãy.

Nếu một "đối sánh" được tìm thấy trong bảng cho một phương thức và loại ngoại lệ được ném là lớp được giám sát trong phạm vi tìm thấy, thì điều khiển được chuyển đến điểm nhập catch, sau khi đặt ngoại lệ vào một loại vị trí thông số để mệnh đề catch có thể tham chiếu đến nó.

Nếu không tìm thấy "kết quả phù hợp" trong bảng thì ngăn xếp cuộc gọi có hiệu quả "popped", đặt phương thức tiếp theo ở trên cùng của ngăn xếp và tìm kiếm "khớp" trong bảng phương pháp trước đó các phạm vi try/catch được lặp lại.

Điều này tất nhiên là quá đơn giản. Có rất nhiều logic bổ sung liên quan đến việc xử lý các phạm vi finally, ví dụ và một số trường hợp "cạnh".

Các vấn đề liên quan