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”类。是这样吗?
答案 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
的子类。 ArithmeticException
是RuntimeException
的次级。
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不是一个经过检查的异常,这就是为什么它允许你编译好。 子类的异常称为已检查的异常,所有异常都未选中。