回答
在Unix環境,在這種劃分被零被signal
經由SIGFPE
主導,JVM將已安裝的捕集SIGFPE
並依次throw
S上的一個ArithmeticException
信號處理程序。如果您對內部感興趣,請參閱man signal
我相信OP所要求的是基於這樣的事實,除非有一個SIGFPE
處理程序到位,否則大多數進程將在接收該信號時採取默認操作,即終止。因此,例如C程序
int main (int argc, char** argv) { int n = 5/0; }
...如果它甚至編譯,將被默認SIGFPE
→SIG_DFL
陣亡。 JVM的處理程序會發出(catch
able)RuntimeException
,以便可以以本機外觀的方式處理這些異常。
正如其他人指出的那樣,並且爲了完整性,事實上從內核生成的SIGFPE
通常是從處理器本身的特殊中斷映射而來;因此,「管道」是一樣的東西
- CPU錯誤陷阱中斷→內核中斷處理程序→
SIGFPE
SIG_DFL
→工藝死亡
或
- CPU錯誤陷阱中斷→內核中斷處理程序→
SIGFPE
JVM處理程序→RuntimeException
ArithmeticException
用戶代碼
在非Unix平臺上,處理是類似的。
操作系統發送信號給進程。默認的處理程序會停止進程,但是你可以爲它定義自己的處理程序。我敢打賭Java VM確實如此。
Java像處理任何其他語言一樣處理這種情況。除以零錯誤會產生處理器異常,從而觸發中斷。如果處理程序已註冊,中斷將被操作系統「讀取」並轉發給程序。由於Java註冊了一個處理程序,它會收到該錯誤,然後將其轉換爲沿着堆棧傳送的ArithmeticException
。
的JVM通過零捕獲司這樣與C:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void fpe_handler(int signum) {
printf("signal is %d", signum);
printf("JVM throws an ArithmeticException here...\n");
exit (1);
}
int main() {
int a = 5;
int b = 0;
signal(SIGFPE, fpe_handler);
printf("%d\n", a/b);
return 0;
}
編譯並執行它打印這樣的:
[email protected]:~$ gcc -o catch_sigfpe myc.c
[email protected]:~$ ./catch_sigfpe
signal is 8
JVM throws an ArithmeticException here...
[email protected]:~$
操作系統同步會發出一個SIGFPE異常,C程序卡子它,然後java構造並向您提供ArithmeticException,然後自行清理以停止Java程序。
查看更多關於此處返回的信號的信息:http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/index.jsp?topic=%2Fcom.ibm.java.doc.user.aix64.60%2Fuser%2Fsighand.html
- 1. 如何處理ML除以零誤差
- 2. 如何在Linq中處理零除以
- 3. 如何處理由零異常除法
- 4. 在Linux中除以零異常處理
- 5. 我該如何處理這些「嘗試除以零」的錯誤?
- 6. 如何處理除以0
- 7. 在JVM(Java)或CLR(C#)中運行時異常處理(如除以零)
- 8. 如何允許除以零?
- 9. 這是如何除以零?
- 10. 在圖形代碼中處理零除
- 11. SSRS 2008 - 按零場景處理除法
- 12. 如何在sql中處理除零錯誤
- 13. 如何在MongoDB彙總框架中處理零除
- 14. 如何處理這個異常? (零esp)
- 15. 如何優雅地處理零例外?
- 16. 如何通過零處理百分比?
- 17. 零作爲零處理零功能
- 18. iOS - 如何處理字符串連接時,值可以爲零?
- 19. ScalaFiddle除以零
- 20. 除以零SSRS
- 21. msvc除以零
- 22. ArithmeticException除以零
- 23. Java計算器ActionListener。除以零時如何更改消息「Infinity」?
- 24. 處理除以0和NA
- 25. Java - 如何處理OutOfMemoryError?
- 26. Java:如何僅處理SIGTERM?
- 27. Java:如何處理圖形?
- 28. 如何處理在Java中
- 29. 如何處理java線程
- 30. Java可以處理Expando嗎?
「先前遇害」是什麼意思? –
一個字:殭屍! –
它沒有。你必須在某個時候在「catch」塊中自己處理它,否則用戶會在他的臉上看到Excetion,這並不好。 – Renan