3

java文档说,检查异常必须指定一个可以“捕获”异常或在方法声明中抛出异常的处理程序。但是,如果我这样做,例如:

public class DivZero{
 public static void main(String[] args){
   int a=10;
   int[] b={1,2,3,4,0};
   for (int i=0;i<b.length;i++){
    System.out.println(a/b[i]);
   }
 }
}

如果没有“try-catch”或“throws”声明,它也可以正常工作。它抛出一个java.lang.ArithmeticException。那么,这不是强制性的吗?编译器以同样的方式隐式抛出合适的 Java“Throwable”类。是这样吗?

4

4 回答 4

5

ArithmeticException扩展RuntimeException因此它不是一个检查异常。已检查异常是继承自Exception但不继承自的异常RuntimeException

引用JLS,11.1.1。例外的种类

[...] 检查异常类都是ThrowableotherRuntimeException及其子类和 Error 及其子类的子类。

于 2012-09-01T16:49:43.107 回答
2

您必须仅捕获已检查的异常:其java.lang.Exception子类不是java.lang.RuntimeException. ArithmeticException是 的子类RuntimeException

RuntimeException(s) 通常会在您的应用程序中发出错误信号,因此您必须解决它们,而不是捕获异常。在您的情况下ArithmeticException,因为您试图将 int 除以 0 而被抛出。System.out.println(a/b[i]);您需要确保在您的程序中不会发生这种划分。

于 2012-09-01T16:50:40.890 回答
2

Java 中有两种异常:扩展Exception的异常称为已检查并且需要处理(捕获它们或抛出它们) - 例如IOException从RuntimeException扩展的那些被称为unchecked并且不需要显式处理,除非您需要对它们做一些事情 - 例如NullPointerException

对于问题中的代码,您可以看到ArithmeticException从 RuntimeException 扩展,因此未选中,您不需要显式处理它。

于 2012-09-01T16:52:11.340 回答
1

ArithmeticException 不是检查异常,这就是它允许您编译的原因。Exception 的子类称为已检查异常,其余所有未检查。

于 2012-09-01T16:50:45.947 回答