当前位置: 首页 > 面试题库 >

在Java中,“ 5/0”语句不会在我的Linux机器上触发SIGFPE信号,为什么?

娄学文
2023-03-14
问题内容

我写了一个非常简单的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主要

... ...
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)

问题答案:

在这里,它引发了SIGFPE。

你忘了跟strace孩子们说话。将-f选项添加到strace,您应该看到类似以下内容:

[pid  2304] read(3, "\312\376\272\276\0\0\0001\0n\n\0\23\0I\t\0\3\0J\7\0K\n\0L\0M\n\0N\0"..., 2369) = 2369
[pid  2304] --- SIGFPE (Floating point exception) @ 0 (0) ---
[pid  2304] rt_sigreturn(0x1c50800)     = 5
[pid  2304] write(2, "Exception in thread \"main\" ", 27Exception in thread "main" ) = 27
[pid  2304] write(2, "java.lang.ArithmeticException: /"..., 40java.lang.ArithmeticException: / by zero) = 40
[pid  2304] write(2, "\n", 1


 类似资料:
  • 问题内容: 每当我从表Y获得任何记录时,我都试图在表X上运行一条语句,无论如何,我只能使用MySQL来完成该操作吗? 像触发器一样? 问题答案: 简短的回答是第触发器触发与,或。 可能的解决方案。相当罕见的情况: 首先,在表X上编写一些执行所需操作的存储过程。 然后,限制所有用户仅使用这些存储过程,并且不允许他们直接在表X上使用。 然后,更改存储过程以也调用执行所需操作(或其他操作)的存储过程。

  • 问题内容: 我正在尝试使用sigaction设置异常处理程序。对于第一个例外,它运作良好。但是在第一个异常之后不会调用sigaction处理程序,并且在第二个信号发生时程序会突然结束。 问题答案: 信号和异常互不相关。您正在使用的内容(从异步信号处理程序引发异常)只能在支持该功能的少数编译器之间移植,例如GCC和Intel C / C ++ with 。 就是说,您忘记做的是取消阻止信号:执行信号

  • 也许有人能帮我澄清一下。 我正在尝试编写一个插入前触发器,如果它留空,可以设置关闭。这可能吗? 没有太多代码可显示。我所做的只是创建了一个带有调试语句的简单的插入前触发器,以确保我的触发器在验证规则之前执行。似乎验证规则是第一位的(我显然无法更改它)。触发器永远不会触发。 这是可行的还是不可能的?

  • 我的java小程序分配有问题。出于某种我无法理解的原因,每当我选中复选框时,我的所有if语句都会立即触发。程序应该更新总价,并在每次按下方框时通知用户。我们必须使用复选框,而不是单选按钮或JCheckBox,并且程序必须编写为小程序。这里是我的代码链接。

  • 我的Codename One应用程序有一个MapContainer,它显示一些标记。当用户点击一个标记时,应该显示一个新的表单,其中包含一些关于标记的细节。下面是我使用的代码:

  • 在我的OS/400V6中。x系统我使用ADDPFTRG命令为物理文件(DB2表)创建了一个插入后触发器,每当我在RPG IV程序上执行写命令或从STRSQL生成INSERT语句时,该命令都会正确触发,但当我使用JT400(JTOpen)JDBC驱动程序从Java程序执行INSERT语句时,触发器不会触发。 在这两种情况下(从OS400和从Java),都会成功插入记录,但只有从OS400插入记录时才