为什么我不能在Java方法中抛出异常?

5

我刚接触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
}

归咎于一个名叫Goodenough的家伙,约1974年。 - Hot Licks
4个回答

10

ArithmeticException是一个RuntimeException,因此无需在throws子句中声明或使用catch块捕获。但是,Exception不是一个RuntimeException

JLS的第11.2节涵盖了这个问题:

未经编译时检查的异常类(§11.1.1)被豁免了。

"未经编译时检查的异常类"包括ErrorRuntimeException

此外,您需要检查y是否为0,而不是检查x / y是否为0


我想在将对象设置为序列化时生成一个NotSerializableException - 通过检查if(someObj instanceof Serializable)。这是不可能的吗? - Lealo

3

0
ArithmeticException是一个未检查的异常,因为它继承了RuntimeException。相比之下,Exception是一个已检查的异常类型,因为它既不继承RuntimeException,也不继承Error
已检查的异常必须在可能抛出它们的方法签名的throws子句中声明。未检查的异常则不需要。
使用您的示例,添加throws Exception就足以使方法编译通过。但请注意,任何调用代码都需要处理该异常,可以通过捕获它或声明它被抛出来处理。
public static void divide(double x, double y) throws Exception {
    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
}

这在Java语言规范(JLS)中有详细记录:
11.1.1. 异常的种类
无需检查的异常类是运行时异常类和错误类。
检查的异常类是除了无需检查的异常类之外的所有异常类。也就是说,检查的异常类是Throwable及其子类,但不包括RuntimeException及其子类以及Error及其子类。
11.2. 编译时异常检查
Java编程语言要求程序包含对可能由方法或构造函数执行引发的检查异常的处理程序(§8.4.6,§8.8.5)。编译时检查异常处理程序的存在旨在减少未正确处理的异常数量。对于每个可能的检查异常结果,方法或构造函数的throws子句必须提及该异常的类或该异常类的超类之一(§11.2.3)。
无需检查的异常类(§11.1.1)不受编译时检查的限制。

0
Java中抛出异常的方法必须在方法签名中声明。
例如: ``` public static void divide(double x, double y) throws Exception ```
如果没有声明,您的代码将无法编译。
有一种特殊的异常子集扩展了RuntimeException类。这些异常不需要在方法签名中声明。
例如:ArithmeticException扩展了RuntimeException。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接