抛出异常以及捕获异常?

时间:2013-06-26 21:52:58

标签: java exception exception-handling throw

我想知道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将处理它,但是声明中提到的异常又如何呢?

5 个答案:

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