我在理解抛出异常时会发生什么问题。
抛出的异常会发生什么?是什么处理它以确保程序不会崩溃?
例如,在这个来自this tutorial的示例中,什么会处理抛出的ArithmeticException
?
static int remainder(int dividend, int divisor)
throws DivideByZeroException {
try {
return dividend % divisor;
}
catch (ArithmeticException e) {
throw new DivideByZeroException();
}
}
答案 0 :(得分:3)
您链接的教程强调了Java中存在哪些类型的异常的重要区别,即异常是已检查还是未选中。
已检查异常是一个要求您作为开发人员捕获它(即处理它),或声明它被抛出并处理上游的异常。期望您可以从这些异常中恢复过来。
未经检查的异常是在应用程序的自然执行期间可能会或可能不会出现的异常,并且可能不会为应用程序引入自然的恢复方式。抓住它们往往是不受欢迎的,因为它往往表明设计很差(你允许零点进入分工操作,这是一个非法的论点!)。
在这种情况下,因为方法remainder
声明它正在抛出DivideByZeroException
,所以的所有上游调用者必须通过以下方式处理其异常:
public static void main(String[] args) {
try {
NitPickyMath.remainder(1, 0);
} catch (DivideByZeroException e) {
e.printStackTrace();
}
}
......或者:
public static void main(String[] args) throws DivideByZeroException {
NitPickyMath.remainder(1, 0);
}
对后一种形式的警告是 nothing 将处理异常,并且会导致应用程序崩溃。
...什么会处理被抛出的
ArithmeticException
?
您已经 通过将其置于catch
块中来处理它。您只需重新抛出一个已检查的异常来处理因将1除以0而导致的实际错误。
答案 1 :(得分:1)
当捕获到异常时,try{}
块执行期间在堆和堆栈上构造的所有内容都将被破坏,程序将跳至catch{}
块并开始在此处执行代码。
Here is a explanation from MSDN for Visual C++,Java应该具有类似的行为。
编辑: 如果您不知道什么是堆栈,请在JVM内存管理系统上阅读。您可能会在youtube上找到很好的视频说明。