我想知道Java如何采用以下场景
public static void main(String[] args) throws IndexOutOfBoundsException, CoordinateException, MissionException, SQLException, ParserConfigurationException {
try {
doSomething();
} catch (Exception e) {
e.printStackTrace();
}
}
在上面的代码中,我声明主函数抛出许多不同的异常,但在函数内部,我正在捕获泛型异常。我想知道java内部如何使用它?即,如果doSomething()
抛出一个IndexOutOfBounds异常,e.printStackTrace()会在最后catch (Exception e) {...}
块中被调用吗?
我知道如果函数的throws区域中未声明的异常被抛出,try / catch将处理它,但是声明中提到的异常又如何呢?
答案 0 :(得分:5)
在你的情况下,如果在doSomething()
中抛出或生成任何异常,它将被捕获在try-catch块中,因为你正在捕获Exception e
。
Exception
是所有例外的父。所有例外都继承自此类。
答案 1 :(得分:3)
catch块比方法级别throw声明具有更高的优先级。如果某个东西会被该catch块传递,那么它将被该方法抛出(但事实并非如此,因为所有提到的异常确实都是从Exception
继承的。)
如果你需要一个由catch块处理但是进一步转发的异常,你必须重新抛出它,例如。
throw e;
答案 2 :(得分:1)
说doSomething()会抛出一个IndexOutOfBounds异常 e.printStackTrace()在最后一个catch中被调用(Exception e){...} 方框?
是的,e.printStackTrace()
将被调用。因为您捕获的Exception
比({1}}的直接或间接超类更广泛,或者您放入throws子句中的任何其他异常。但是如果你捕获一些比IndexOutOfBoundException
更窄的异常以及throws子句中的其他异常,并且遇到任何这些异常,则会触发throws子句。
答案 3 :(得分:0)
假设您有以下代码:
try{
doSomething();
}catch(Exception ex){
System.out.println("Exception:");
ex.printStackTrace();
}catch(IndexOutOfBoundsException ex){
System.out.println("IndexOutOfBoundsException :");
ex.printStackTrace();
}
您将收到编译错误
异常 IndexOutIfBounds 已被捕获
那是因为每个例外都继承自Exception
类,所以捕获块捕获的第一件事就是异常,因为 IndexOutOfBounds 是一个异常,所以不需要捕获第一次是两次,第二次是一次
在一种情况下,如果您未在throws
之后或try-catch中声明异常类,则throws将执行其工作。
答案 4 :(得分:0)
声明中提到的异常是允许进一步调用堆栈的方法来处理它。在您的情况下,如果您的main方法抛出它们,这些异常将由运行时处理。
来源http://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html