繁体   English   中英

抛出异常以及捕获异常?

[英]Throwing exceptions as well as catching exceptions?

我想知道Java如何采用以下方案

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

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

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

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

Exception是所有例外的父级 所有异常都继承自此类。

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

如果你需要一个由catch块处理但是进一步转发的异常,你将不得不重新抛出它,例如

throw e;

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

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

假设你有这个代码:

   try{
        doSomething();
    }catch(Exception ex){
        System.out.println("Exception:");
        ex.printStackTrace();
    }catch(IndexOutOfBoundsException ex){
         System.out.println("IndexOutOfBoundsException :");
        ex.printStackTrace();
    }

您将收到编译错误说明

异常IndexOutIfBounds已被捕获

这是因为每个异常都Exception类继承,所以捕获块捕获的第一件事就是异常,因为IndexOutOfBounds是一个Exception,因此不需要为第一个捕获两次,第二次捕获一次。
在一种情况下,当您在throws之后或try-catch中未声明异常类时,throws将执行其工作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM