Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抛出异常和捕获异常?_Java_Exception_Exception Handling_Throw - Fatal编程技术网

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

我想知道Java是如何处理以下场景的

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块中抛出它们。这就是所谓的链式异常