は、私は非常に単純なCプログラムを書いた:Javaでは、 "5/0"ステートメントはLinuxマシンでSIGFPEシグナルを発しません、なぜですか?
#include<stdio.h>
int main(){
int a=2;
int b=0;
printf("%d\n", a/b);
}
をし、straceのとそれを実行します。
... ...
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
は出力が一致した(のみ貼り付ける尾部)straceのを./a.outと出力の下に取得する私のそれは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のジャワ-Xcompメイン
... ...
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)
そこには浮動小数点はありませんが。なぜ浮動小数点信号を期待していますか?そしてあなたの 'C'コードは本当にintを使用しましたか? – EJP
Javaレベルの例外がありますか? DivisionByZeroExceptionまたは何か。それは十分ではないですか?あなたは、JVMがプロセッサーとどのように話し合っているか興味を持っていますか? – Thilo
おそらく私は何かを見逃していますが、あなたはJavaでDivideByZeroExceptionをキャッチしませんか? – Gaff