Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试着用零除_Java_Try Catch_Divide By Zero - Fatal编程技术网

Java 试着用零除

Java 试着用零除,java,try-catch,divide-by-zero,Java,Try Catch,Divide By Zero,我的问题是关于在一个简单的零除示例中尝试捕捉块。你看到试一试的第一行了吗?如果我将这两个变量中的任何一个转换为double,程序将无法识别catch块。在我看来,无论我投还是不投,都必须执行catch块。这个代码有什么问题 public static void main(String[] args) { int pay=8,payda=0; try { double result=pay/(double)payda; // if I cast any o

我的问题是关于在一个简单的零除示例中尝试捕捉块。你看到试一试的第一行了吗?如果我将这两个变量中的任何一个转换为double,程序将无法识别catch块。在我看来,无论我投还是不投,都必须执行catch块。这个代码有什么问题

public static void main(String[] args) {

    int pay=8,payda=0;  

    try {

        double result=pay/(double)payda; // if I cast any of the two variables, program does not recognize the catch block, why is it so?
        System.out.println(result);
        System.out.println("inside-try");

    } catch (Exception e) {

        System.out.println("division by zero exception");
        System.out.println("inside-catch");

    }
}

除零对浮点数有效

  • 1/0产生无穷大
  • (-1)/0产生-无穷大
  • 0/0产生NaN
这些“数字”在IEEE 754中有正确的定义


另一方面,整数除以零会抛出,因为不能将无穷大表示为
int

答案在于程序自己的输出-它为
结果打印“无穷大”。这是因为Java只允许整数除以零-浮点除以零是合法的,并且产生
无穷大

关于
正无穷大
负无穷大
常数,请参阅和的文档。

我建议验证:

if (divisor != 0) {
    // calculate
}

而不是捕获异常

,因为除以两个double返回一个无穷大,但不会抛出。您可以使用来检查这一点。但是,适当的解决方案(如前所述)是在除法之前检查分母。

只有用整数除零才会引发算术异常。
用double或float除零将导致无穷大

因为您自称是“新手”,我认为指出代码中一些更广泛的问题是个好主意。(我知道这不是生产代码,但为了论证起见,让我们假设它是。)

  • 如果预期会出现异常,那么如果检测到将导致异常的条件,通常会更简单、更清晰、更高效。在这种情况下,如果您希望除数
偶尔为零,最好在除法之前测试它

  • 另一方面,如果异常完全出乎意料(即“bug”),最好的策略是让异常传播到最外层。此时,应用程序捕获应该捕获所有异常,记录异常堆栈跟踪并退出

  • 除了前面的项目符号外,捕获
    异常
    运行时异常
    可丢弃的
    错误
    是个坏主意。这样做将捕获大量您可能不打算捕获的异常。在这种情况下,由于您期望出现一个
    算术异常
    ,因此您应该捕获它

  • 在金融应用程序中使用
    float
    double
    很少是正确的。这些类型并不精确,但金融应用程序通常需要精确处理大量资金

  • 更一般地说,浮点数本质上很难让外行(和新手)理解。人们期望掌握的许多“真理”实际上并不成立。例如,浮点计算
    1.0/3.0+1.0/3.0+1.0/3.0
    不会给出
    1.0
    。类似地(正如您所发现的),被零除的行为也不同。如果您想安全地使用浮点,您需要了解其中的陷阱

  • 编辑针对@Jay的评论详细阐述第一点

    首先,我故意用“通常”这个词。在某些情况下,避免抛出预期的异常将一事无成

    话虽如此,即使您的应用程序无法立即处理这种情况,您通常也不希望发生一般的“预期”异常。例如,如果OP的代码是更大的代码的一部分,那么最好显式抛出
    IllegalArgumentException
    (如果这违反了API约定)或者一些选中的
    UserEnteredRubbishException
    ,如果我们知道这是错误用户输入的结果(并且有机会报告/纠正它)


    事实上,我们“期望”一个异常,从定义上来说,意味着我们对它的了解要比(比如)一个通用的
    算术异常所说的要多。如果我们允许一个泛型异常传播,那么捕获块和许多堆栈帧就很难正常工作。例如,在这种情况下,远程catch块无法确定地诊断被零除的原因。
    arithmetricexception
    可能来自应用程序的不同部分,甚至可能不是零除!解决问题的方法是显式地抛出一个更具体的异常。

    任何人都不应该期望从代码中抛出
    RuntimeException
    。这些异常可以(而且应该)很容易避免。

    如果其中一个参数为NaN,或者两个参数都为无穷大,或者两个参数都为零,则除法只返回NaN。将一个非零除以零——这个问题——得到正无穷大或负无穷大。我要对你的第一点提出质疑。如果需要特殊情况,并且您可以做一些事情来处理它并继续处理,那么是的,您应该检查它,而不是抛出异常。但是,如果,不管人们多么期待一个特殊情况,当它发生时,你所能做的就是叫喊恐慌,释放战狗,那么就抛出一个例外。但是,mega dittos在第3和第4节。捕获泛型异常很少有成效。你不知道你在抓什么。顺便说一下,我可以补充一句:推论:不要抛出泛型异常。如果您的程序检测到一个错误条件,并且您想抛出一个异常,请花十分钟为它创建一个扩展异常的新类。不要只是“抛出新异常(“Foo缺少一个条”)或其他什么。如果浮点除法不能抛出异常,那么应该删除try/catch并使用错误代码。我不认为
    int
    抛出异常,因为它不能表示infini