Tôi chỉ tò mò là làm thế nào nó có thể cho Java JVM để đôi khi nội tuyến phương pháp có khả năng ném ngoại lệ. Tôi giả sử rằng có thể nội tuyến ít nhất một số phương pháp như vậy (chẳng hạn như những phương thức có truy cập mảng và do đó có khả năng ném ArrayIndexOutOfBoundsException
s). Vấn đề tôi thấy là nếu ngoại lệ thực sự xảy ra, làm thế nào để bạn hiển thị theo dõi stack đúng nếu bạn đã phác thảo phương pháp? Vì các phương thức khác nhau có thể được gạch chân trên các máy khác nhau, làm cách nào để nội tuyến không phá vỡ cơ chế theo dõi ngăn xếp?Làm cách nào để các phương pháp ném ngoại lệ được gạch chân?
Trả lời
Vấn đề bạn dự tính là gì? Vì chính bản thân JVM thực hiện nội tuyến, không có gì ngăn cản nó ghi nhớ những gì nó đã phác thảo ở đâu và chính xác cho điều này khi nó xây dựng một dấu vết ngăn xếp để cài đặt trong một đối tượng Throwable.
Khi ngoại lệ là ném được xây dựng, JVM sẽ đi bộ ngăn xếp CPU và tìm hiểu xem mỗi khung ngăn xếp máy có tương ứng với mã bytecode, mã JITted, mã gốc từ thư viện hay không. Đối với điều này, nó đề cập đến các bảng cho biết địa chỉ nào trong mã máy tương ứng với các lệnh từ bytecode (và tiếp tục quay trở lại các dòng nguồn, nếu thông tin đó là nhấn trong tệp lớp). Bảng này hoàn toàn có thể chỉ rõ rằng một nơi nhất định trong mã JITted có thể tương ứng với nhiều hơn một khung ngăn xếp cấp Java.
Tuy nhiên, JVM không phải là yêu cầu để thực hiện việc này. Nó cũng có thể chỉ đơn giản là để xây dựng dấu vết ngăn xếp với phá vỡ bí ẩn trong đó. Xem javadoc for Throwable.getStackTrace(). (Thậm chí không có yêu cầu rằng một JVM có thể tạo ra các dấu vết ngăn xếp ở tất cả).
Bạn có thể muốn kiểm tra this document sẽ giải thích cách xử lý ngoại lệ hoạt động trong JVM:
Mỗi phương pháp mà bắt ngoại lệ được kết hợp với một bảng ngoại lệ đó là giao trong tập tin lớp cùng với các chuỗi bytecode của phương thức . Bảng ngoại lệ có một mục nhập cho mỗi ngoại lệ là bị chặn bởi mỗi khối thử. Mỗi mục có bốn mẩu thông tin: điểm bắt đầu và điểm kết thúc, bù trừ máy tính trong chuỗi bytecode để chuyển đến và chỉ mục hồ bơi không đổi của lớp ngoại lệ là bị bắt.
Tôi sẽ quan tâm để kiểm tra xem nó ra. Tôi đã đặc biệt hỏi về sự tương tác của nội tuyến với ngoại lệ, mặc dù. Dường như nếu một hàm được gạch chân, thông tin dấu vết ngăn xếp sẽ bị mất, nhưng dường như nó không có trong một chương trình Java. – Gravity
Hãy nhớ rằng nội tuyến trong Java diễn ra trong thời gian chạy, không biên dịch thời gian như C/C++, vì vậy bạn không 'mất' bất kỳ thông tin nào. Bất kỳ thông tin nào được tối ưu hóa và cần được lấy ra có thể được lưu trữ trong bảng tra cứu/nhảy. –
Sẽ không lưu trữ thông tin ngoại lệ trong bảng tra cứu gây ra hiệu suất không được chấp nhận, đặc biệt là đối với trường hợp ngoại lệ rất phổ biến như ArrayIndexOutOfBounds? – Gravity
- 1. Phương pháp JAXB XMLAdapter không ném ngoại lệ
- 2. Phương pháp khai báo để ném ngoại lệ và phân lớp của ngoại lệ này
- 3. tuyên bố một phương pháp luôn ném một ngoại lệ?
- 4. Làm thế nào để ném ngoại lệ cho người gọi từ phương pháp async?
- 5. Khi trả lại bool, hãy ném ngoại lệ và ngoại lệ nào để ném
- 6. Cách tìm ra các hàm nào KHÔNG được gạch chân
- 7. JLabel được gạch chân
- 8. Cách tắt "Ngắt khi ngoại lệ được ném" cho các loại ngoại lệ tùy chỉnh
- 9. Việc ném một ngoại lệ trong một phương thức có khiến phương thức trả về không?
- 10. BeginInvoke ném ngoại lệ
- 11. Loại ngoại lệ nào để ném cho các chuỗi
- 12. Làm thế nào để làm cho nó rõ ràng rằng một phương pháp có thể ném một ngoại lệ?
- 13. ném mới std :: ngoại lệ vs ném std :: ngoại lệ
- 14. TransactionScope ném ngoại lệ
- 15. Làm thế nào để giả lập một phương pháp tĩnh void để ném ngoại lệ với Powermock?
- 16. C# Ngoại lệ ném lại
- 17. WebAuthenticationBroker.AuthenticateAsync ném ngoại lệ
- 18. bắt ngoại lệ trong Main() phương pháp
- 19. Bắt ngoại lệ được ném từ các tệp DLL
- 20. Tridion RepositoryLocalObject.GetBluePrintChú pháp phương pháp (BluePrintChainFilter) đưa ra ngoại lệ cho các mục được chia sẻ
- 21. Làm thế nào để tái ném một ngoại lệ
- 22. recursive_directory_iterator ném ngoại lệ
- 23. Làm thế nào để tạo gạch chân kép, gạch chân chấm cho văn bản trong css
- 24. C# trình biên dịch lỗ hổng ?: Không phát hiện các phương pháp luôn ném ngoại lệ
- 25. Có cách nào tĩnh để ném ngoại lệ trong php
- 26. Eclipse Indigo PDT không gạch chân các lỗi cú pháp
- 27. Làm cách nào để xác định ngoại lệ nào "x []" có thể bị ném?
- 28. LLVM ngoại lệ ném
- 29. Ném hay không ném ngoại lệ từ các phương pháp tiêu thụ bởi lớp ASP.NET Web API
- 30. Ném ngoại lệ từ các nhà thầu
Trong C++, nội tuyến gần như đảm bảo mất thông tin ngăn xếp. Thực tế là một dấu vết ngăn xếp ngoại lệ bị thiếu một khung không phải là kết thúc của thế giới, mặc dù; nó chỉ là một hậu quả được chấp nhận của nội tuyến (và một trong những lý do trình biên dịch cung cấp các tùy chọn chế độ gỡ lỗi để ngăn chặn tất cả nội tuyến). Tôi không biết liệu Java có hoạt động giống nhau hay không. –
Tôi có nghĩa đây là một câu hỏi Java, nhưng thú vị để biết về cách thức hoạt động của nó trong C++. – Gravity