4

我想知道Java如何采用以下场景

public static void main(String[] args) throws IndexOutOfBoundsException, CoordinateException, MissionException, SQLException, ParserConfigurationException {
    try {
        doSomething();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

在上面的代码中,我声明主函数抛出许多不同的异常,但在函数内部,我捕获了通用异常。我想知道java如何在内部接受这个?即,说doSomething()抛出一个 IndexOutOfBounds 异常,会在最后一个catch (Exception e) {...}块中调用 e.printStackTrace() 吗?

我知道如果在函数的 throws 区域中未声明的异常被抛出,try/catch 会处理它,但是声明中提到的异常呢?

4

5 回答 5

5

在您的情况下,如果抛出或生成任何异常,doSomething()由于您正在捕获,它将被捕获在 try-catch 块Exception e中。

Exception是所有异常的父级。所有异常都继承自这个类。

于 2013-06-26T21:56:36.323 回答
3

catch 块比方法级别的 throw 声明具有更高的优先级。如果某些东西会通过该 catch 块,它将被该方法抛出(但事实并非如此,因为您提到的所有异常确实都是从 继承的Exception)。

如果您需要由 catch 块处理但进一步转发的异常,则必须重新抛出它,例如

throw e;
于 2013-06-26T21:59:48.440 回答
1

说 doSomething() 抛出一个 IndexOutOfBounds 异常, e.printStackTrace() 会在最后一个 catch (Exception e) {...} 块中被调用吗?

是的,e.printStackTrace()将被调用。因为您已经捕获了Exception比(直接或间接超类)IndexOutOfBoundException或您在 throws 子句中放置的任何其他异常更广泛的异常。但是,如果您IndexOutOfBoundException在 throws 子句中捕获了一些比其他异常更窄的异常,并且遇到任何这些异常,则 throws 子句将触发。

于 2013-06-26T21:59:34.723 回答
0

声明中提到的异常是允许调用堆栈更上层的方法来处理它。在您的情况下,如果您的 main 方法抛出它们,这些异常将由运行时处理。

来源http://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

于 2013-06-26T22:08:14.587 回答
0

假设您有以下代码:

   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 将发挥作用。

于 2013-06-26T22:07:08.103 回答