我是Java新手,在抛出异常方面遇到了一些问题。也就是说,为什么这是不正确的
public static void divide(double x, double y){
if(y == 0){
throw new Exception("Cannot divide by zero.");
//Generates error message that states the exception type is unhanded
}
else
System.out.println(x + " divided by " + y + " is " + x/y);
//other code follows
}
但是这个好吗?
public static void divide(double x, double y){
if(y == 0)
throw new ArithmeticException("Cannot divide by zero.");
else
System.out.println(x + " divided by " + y + " is " + x/y);
//other code follows
}
答案 0 :(得分:9)
ArithmeticException
是RuntimeException
,因此不需要在throws
子句中声明或由catch
块捕获。但Exception
不是RuntimeException
。
Section 11.2 of the JLS涵盖了这一点:
未经检查的异常类(第11.1.1节)免于编译时检查。
“未经检查的例外类”包括Error
和RuntimeException
s。
此外,您还需要检查y
是0
,而不是x / y
是0
。
答案 1 :(得分:3)
您需要在方法签名 中为未经检查的例外添加throws
。例如:
public static void divide(double x, double y) throws Exception {
...
}
自ArithmeticException extends RuntimeException以来,第二个示例中不需要throws
。
更多信息:
答案 2 :(得分:0)
在Java中抛出异常的方法必须在方法签名中对其进行删除
public static void divide(double x, double y) throws Exception
如果没有声明,您的代码将无法编译。
有一个特殊的异常子集可以扩展RuntimeException
类。这些异常不需要在方法签名中声明。
ArithmeticException
扩展了RuntimeException