【发布时间】:2012-01-02 18:13:12
【问题描述】:
我写了一个很简单的c程序:
#include<stdio.h>
int main(){
int a=2;
int b=0;
printf("%d\n", a/b);
}
并使用 strace 运行它: strace ./a.out 并得到以下输出(仅粘贴尾部)
... ...
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f04c7fb8000, 4096, PROT_READ) = 0
munmap(0x7f04c7f96000, 127640) = 0
--- SIGFPE (Floating point exception) @ 0 (0) ---
+++ killed by SIGFPE +++
Floating point exception
输出符合我的预期,因为它被 SIGFPE 信号杀死了。
但是,用Java编写的同一个程序,没有收到SIGFPE信号,有人知道java如何处理“除以零”异常吗?
public class Main {
public static void main(String[] args) {
int a = 2;
int b = 0;
System.out.println(a / b);
}
}
strace java -Xcomp Main
... ...
mprotect(0xf6949000, 8171520, PROT_READ|PROT_WRITE) = 0
mprotect(0xf6949000, 8171520, PROT_READ|PROT_EXEC) = 0
munmap(0xf774f000, 5727) = 0
mmap2(NULL, 331776, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xfffffffff68d0000
mprotect(0xf68d0000, 4096, PROT_NONE) = 0
clone(child_stack=0xf6920494, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xf6920bd8, tls=0xf6920bd8, child_tidptr=0xff9c5520) = 958
futex(0xf6920bd8, FUTEX_WAIT, 958, NULL) = 0
exit_group(0)
【问题讨论】:
-
你得到了 Java 级别的异常,对吧? DivisionByZeroException 什么的。这还不够好吗?您对 JVM 如何与处理器对话感兴趣吗?
-
也许我遗漏了一些东西,但你不会抓住 Java 中的 DivideByZeroException 吗?
-
你为什么希望它们是一样的?这两种语言没有任何共同之处。
-
我认为他是在问虚拟机如何在内部完成它,而不是如何在 Java 代码中捕获它。
-
是的,正如 Boann 所说,我对 VM 内部的工作方式很感兴趣。 ~
标签: java c linux exception-handling signals