Java:已检查异常的处理程序

时间:2012-09-01 16:48:19

标签: java exception checked

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 个答案:

答案 0 :(得分:4)

ArithmeticException扩展RuntimeException因此它不是一个经过检查的例外。已检查的例外是从Exception继承但未从RuntimeException继承的例外。

引用JLS, 11.1.1. The Kinds of Exceptions

  

[...]已检查的异常类是除Throwable以外的RuntimeException及其子类和Error及其子类的所有子类。

答案 1 :(得分:2)

您必须仅捕获已检查的例外:java.lang.Exception的子图块不是java.lang.RuntimeException的子类。 ArithmeticExceptionRuntimeException的次级。

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

答案 2 :(得分:2)

Java中有两种例外:扩展Exception的例外被称为checked,需要处理(捕获它们或抛出它们) - 例如,IOException 。从RuntimeException延伸的unchecked称为NullPointerException,不需要明确处理,除非您需要对它们执行某些操作 - 例如ArithmeticException

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

答案 3 :(得分:1)

ArithmeticException不是一个经过检查的异常,这就是为什么它允许你编译好。 子类的异常称为已检查的异常,所有异常都未选中。