抛出异常和捕获异常同时进行?

4

我在想Java如何处理以下情况

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

在上述代码中,我声明了主函数可以抛出多个不同的异常,但在函数内部,我捕获了通用的 Exception 异常。我想知道 Java 在内部是如何处理这个问题的?也就是说,假设 doSomething() 抛出了一个 IndexOutOfBounds 异常,那么最后一个 catch (Exception e) {...} 块中的 e.printStackTrace() 会被调用吗?
我知道如果一个函数中抛出了未在 throws 区域声明过的异常,try/catch 语句将会处理它,但是对于在声明中提到的异常呢?
5个回答

5

如果在doSomething()内部抛出或生成了任何异常,由于你捕获的Exception e,它将被try-catch块捕获。

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


有时候,我希望在try/catch中处理异常后再抛出。这种情况下,我应该在异常的结尾处使用 throw e; 吗? - E.S.
是的,不要忘记你可以创建自己的异常并在catch块中抛出它们。这被称为链接异常。http://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html - MaVRoSCy

3

catch块的优先级比方法级别的throw声明更高。如果某些异常被catch块捕获,它将被该方法抛出(但这不是情况,因为您提到的所有异常确实都继承自Exception)。

如果您需要将异常处理程序处理但进一步转发,您必须重新抛出它,例如:

throw e;

1
如果说doSomething()抛出IndexOutOfBounds异常,那么在最后的catch(Exception e){...}块中e.printStackTrace()将被调用。是的,因为你捕获了Exception,它比IndexOutOfBoundException更广泛(直接或间接超类),或者任何你放在throws子句中的其他异常。但是,如果你捕获了一些比IndexOutOfBoundException和throws子句中的其他异常更窄的异常,并且遇到了其中任何一个异常,则会触发throws子句。

0
假设您有以下代码:
   try{
        doSomething();
    }catch(Exception ex){
        System.out.println("Exception:");
        ex.printStackTrace();
    }catch(IndexOutOfBoundsException ex){
         System.out.println("IndexOutOfBoundsException :");
        ex.printStackTrace();
    }

您将获得一个编译错误,其中显示如下:

已捕获异常IndexOutIfBounds

这是因为每个异常都继承自Exception类,所以第一个catch块捕获的是Exception。由于IndexOutOfBounds也是一种Exception,因此不需要再次捕获它,因为第一个已经捕获了。
在某些情况下,当您在throws或try-catch之后没有声明异常类时,throws将会起作用。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接