【问题标题】:How to fix divide by zero exception?如何修复除以零异常?
【发布时间】:2019-10-06 17:32:04
【问题描述】:

Sphere Online Judge (SPOJ) 上的素数生成器有问题。

输入:单行中的测试用例数量t (t

输出:对于每个测试用例,打印所有质数 p,使得 m

我将 prime[0] 和 prime1 设为 -1。

    int range[][] = new int[t][2];
    for (int i = 0; i < t; i++)     //take t ranges
    {
        for(int j = 0; j < 2; j++)
        {
            range[i][j] = sc.nextInt();
        }

    }
    for(int i = 0; i < t; i++)                       
    {
        int prime[] = new int[range[i][1]+1];
        for(int k = 2; k <= range[i][1]; k++)
        {
            prime[k] = k;
        }
        prime[0] = -1;
        prime[1] = -1;
        for(int k = 2; k <= range[i][1]; k++)
        {
            for(int m = k + 1; m < range[i][1]; m++)
            {
                int x = prime[k];
                if(prime[m] % x == 0)
                {
                    prime[m] = 0;
                }
            }
        }
    }

我尝试用eratosthenes 的筛子解决它。输出是: Exception in thread "main" java.lang.ArithmeticException: / by zero

【问题讨论】:

标签: java exception divide-by-zero


【解决方案1】:

您看到除以零异常是因为您的程序中的一条语句试图将一个值除以一个零值,而这在 Java 或我所知道的任何其他编程语言中是不允许的。

您可以做两件事,(1) 检查除数的值,如果它为零,则不要进行除法,或者 (2) 使用 try/catch 捕获异常。

参见Java if vs. try/catch overheadUsing try-catch java

查看您的代码,我不确定除以零的位置,尽管您可能在此区域使用模运算符 (%) 来检查除法的余数是否为零:

for(int m=k+1; m<range[i][1]; m++)
{
    int x = prime[k];
    if(prime[m] % x == 0)  // use modulus operator to check the remainder
    {
        prime[m] = 0;
    }
}

您可能想要执行以下操作:

for(int m=k+1; m<range[i][1]; m++)
{
    int x = prime[k];
    if(x == 0 || prime[m] % x == 0)  // use modulus operator to check the remainder
    {
        prime[m] = 0;
    }
}

【讨论】:

  • 注意:“这在 Java 中是不允许的” - 它允许 double - JLS 15.17.2. Division Operator /:“浮点除法的结果......:非零有限值的除法零导致有符号无穷大”
  • @CarlosHeuberger 感谢您对特殊情况的澄清。这是int,但是您引用的浮点规则对我来说是新的。我对double 做的不多。什么是有符号无穷大?
  • Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY,一些表示正无穷或负无穷的 bit-patterns,类似于表示 Not-a-Number 的 Double.NaN(例如 @ 987654333@) [也适用于Float]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
相关资源
最近更新 更多