簡體   English   中英

JVM如何“拋出”異常

[英]How does JVM “throw” an exception

我知道JVM有一個異常表,它映射可能在給定的字節碼索引中拋出的異常。 我還讀到了遠程字節碼拋出了堆棧頂部存在的引用類型。 我的問題更多地涉及像irem“拋出”異常的指令。

在每次執行指令后,JVM是否檢查堆棧頂部以檢查是否存在異常? 非常感謝有關這方面的任何見解。

irem是“邏輯int余數”運算符。 Java虛擬機規范寫道

運行時異常

如果int余數運算符的除數值為0,則irem拋出ArithmeticException

未指定JVM實現如何完成。 它可以指示CPU在執行除法之前將除數與零進行比較,或者執行除法,然后對有問題的CPU作出反應,發出除0的信號。 由於零除可能很少,后一種策略可能更有效。

例如, 英特爾64和IA-32架構軟件開發人員手冊合並了卷3A,3B和3C:系統編程指南寫道:

6.1中斷和例外概述

當處理器在執行指令時檢測到錯誤條件(例如除以零)時會發生異常。 處理器檢測各種錯誤情況,包括保護違規,頁面錯誤和內部機器故障。 Pentium 4,Intel Xeon,P6系列和Pentium處理器的機器檢查架構還允許在檢測到內部硬件錯誤和總線錯誤時生成機器檢查異常。

當接收到中斷或檢測到異常時,當處理器執行中斷或異常處理程序時,當前正在運行的過程或任務被暫停。 當處理程序的執行完成時,處理器恢復執行中斷的過程或任務。 在不丟失程序連續性的情況下恢復中斷的過程或任務,除非無法從異常中恢復或中斷導致當前正在運行的程序終止。

因此,JVM將定義該異常處理程序以創建異常對象,在一個眾所周知的寄存器中保留對它的引用,然后繼續執行一個字節碼指令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM