Java 试着用零除
我的问题是关于在一个简单的零除示例中尝试捕捉块。你看到试一试的第一行了吗?如果我将这两个变量中的任何一个转换为double,程序将无法识别catch块。在我看来,无论我投还是不投,都必须执行catch块。这个代码有什么问题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
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
另一方面,整数除以零会抛出,因为不能将无穷大表示为
int
答案在于程序自己的输出-它为结果打印“无穷大”。这是因为Java只允许整数除以零-浮点除以零是合法的,并且产生无穷大
关于正无穷大
和负无穷大
常数,请参阅和的文档。我建议验证:
if (divisor != 0) {
// calculate
}
而不是捕获异常,因为除以两个double返回一个无穷大,但不会抛出。您可以使用来检查这一点。但是,适当的解决方案(如前所述)是在除法之前检查分母。只有用整数除零才会引发算术异常。
用double或float除零将导致无穷大因为您自称是“新手”,我认为指出代码中一些更广泛的问题是个好主意。(我知道这不是生产代码,但为了论证起见,让我们假设它是。)
- 如果预期会出现异常,那么如果检测到将导致异常的条件,通常会更简单、更清晰、更高效。在这种情况下,如果您希望除数
偶尔为零,最好在除法之前测试它
异常
、运行时异常
、可丢弃的
或错误
是个坏主意。这样做将捕获大量您可能不打算捕获的异常。在这种情况下,由于您期望出现一个算术异常
,因此您应该捕获它float
或double
很少是正确的。这些类型并不精确,但金融应用程序通常需要精确处理大量资金1.0/3.0+1.0/3.0+1.0/3.0
不会给出1.0
。类似地(正如您所发现的),被零除的行为也不同。如果您想安全地使用浮点,您需要了解其中的陷阱IllegalArgumentException
(如果这违反了API约定)或者一些选中的UserEnteredRubbishException
,如果我们知道这是错误用户输入的结果(并且有机会报告/纠正它)
事实上,我们“期望”一个异常,从定义上来说,意味着我们对它的了解要比(比如)一个通用的
算术异常所说的要多。如果我们允许一个泛型异常传播,那么捕获块和许多堆栈帧就很难正常工作。例如,在这种情况下,远程catch块无法确定地诊断被零除的原因。arithmetricexception
可能来自应用程序的不同部分,甚至可能不是零除!解决问题的方法是显式地抛出一个更具体的异常。任何人都不应该期望从代码中抛出RuntimeException
。这些异常可以(而且应该)很容易避免。如果其中一个参数为NaN,或者两个参数都为无穷大,或者两个参数都为零,则除法只返回NaN。将一个非零除以零——这个问题——得到正无穷大或负无穷大。我要对你的第一点提出质疑。如果需要特殊情况,并且您可以做一些事情来处理它并继续处理,那么是的,您应该检查它,而不是抛出异常。但是,如果,不管人们多么期待一个特殊情况,当它发生时,你所能做的就是叫喊恐慌,释放战狗,那么就抛出一个例外。但是,mega dittos在第3和第4节。捕获泛型异常很少有成效。你不知道你在抓什么。顺便说一下,我可以补充一句:推论:不要抛出泛型异常。如果您的程序检测到一个错误条件,并且您想抛出一个异常,请花十分钟为它创建一个扩展异常的新类。不要只是“抛出新异常(“Foo缺少一个条”)或其他什么。如果浮点除法不能抛出异常,那么应该删除try/catch并使用错误代码。我不认为int
抛出异常,因为它不能表示infini