Java 抛出异常和捕获异常?
我想知道Java是如何处理以下场景的Java 抛出异常和捕获异常?,java,exception,exception-handling,throw,Java,Exception,Exception Handling,Throw,我想知道Java是如何处理以下场景的 public static void main(String[] args) throws IndexOutOfBoundsException, CoordinateException, MissionException, SQLException, ParserConfigurationException { try { doSomething(); } catch (Exception e) { e.pri
public static void main(String[] args) throws IndexOutOfBoundsException, CoordinateException, MissionException, SQLException, ParserConfigurationException {
try {
doSomething();
} catch (Exception e) {
e.printStackTrace();
}
}
在上面的代码中,我声明main函数来抛出许多不同的异常,但是在函数内部,我捕获了泛型异常。我想知道java是如何在内部处理这个问题的?也就是说,假设doSomething()
抛出一个IndexOutOfBounds异常,那么在最后一个catch(exception e){…}
块中是否会调用e.printStackTrace()
我知道如果抛出函数的throws区域中未声明的异常,try/catch将处理它,但是声明中提到的异常呢 在您的情况下,如果在
doSomething()
中引发或生成任何异常,它将在try-catch块中被捕获,因为您正在捕获异常e
异常
是所有异常的父项。所有异常都继承自该类
假设doSomething()抛出IndexOutOfBounds异常,则
e、 printStackTrace()在最后一次捕获中被调用(异常e){…}
街区
是,将调用
e.printStackTrace()
。因为您捕获了异常
,它比(直接或间接的超类)indexootfboundexception
或您在throws子句中放入的任何其他异常都要广泛。但是,如果捕获的某些异常比IndexOutOfBoundException中的IndexOutOfBoundException
更窄,并且在throws子句中遇到了其他异常,则将触发throws子句。与方法级别的throw声明相比,catch块的优先级更高。如果某个对象将通过该catch块,它将由该方法抛出(但情况并非如此,因为您提到的所有异常确实都是从异常继承的)
如果您需要catch块处理一个异常,但需要进一步转发,则必须重新转发它,例如
throw e;
假设您有以下代码:
try{
doSomething();
}catch(Exception ex){
System.out.println("Exception:");
ex.printStackTrace();
}catch(IndexOutOfBoundsException ex){
System.out.println("IndexOutOfBoundsException :");
ex.printStackTrace();
}
您将得到一个编译错误
已捕获异常IndexOutIfBounds
这是因为每个异常都继承自Exception
类,所以catch块捕获的第一件事就是异常,因为IndexOutOfBounds是一个异常,所以不需要捕获两次,第一次捕获一次,第二次捕获一次。
在一种情况下,如果在throws之后或在try catch中没有声明异常类,则throws将完成其工作。声明中提到的异常是允许调用堆栈上更高的方法来处理它。在您的情况下,如果主方法抛出这些异常,这些异常将由运行时处理
Source问题是,有时我希望它在try/catch中得到处理,然后被抛出。在这种情况下,我应该做一个抛出e代码>在异常结束时?是的,别忘了您可以创建自己的异常,并可能在catch块中抛出它们。这就是所谓的链式异常