Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 如果有多个catch块,为什么在catch块中不捕获RuntimeException?_Java_Exception_Try Catch - Fatal编程技术网

Java 如果有多个catch块,为什么在catch块中不捕获RuntimeException?

Java 如果有多个catch块,为什么在catch块中不捕获RuntimeException?,java,exception,try-catch,Java,Exception,Try Catch,我能够通过以下代码捕获RuntimeException或其子类: try { //code that throws subclass of RuntimeException throw new ChildRuntimeException("try"); } catch (Exception ex) { System.out.println(ex.getMessage()); } 但我在下面的代码中遇到错误,无法在异常捕获块中捕获RuntimeExce

我能够通过以下代码捕获RuntimeException或其子类:

try {
    //code that throws subclass of RuntimeException
    throw new ChildRuntimeException("try");
} catch (Exception ex) {
    System.out.println(ex.getMessage());
}
但我在下面的代码中遇到错误,无法在异常捕获块中捕获RuntimeException

try {
    // code that throws subclass of Exception
    throw new ChildExceptionClass("try");
} catch (ChildExceptionClass ex) {
    throw new RuntimeException(ex.getMessage());
} catch (Exception ex) {
    System.out.println(ex.getMessage());
}
我搜索了相同类型的问题,但没有找到合适的答案。可以
有人解释为什么行为不同吗?

在第二个示例中,您抛出了一个childRuntimeException,它被捕获,但随后抛出了一个新的runtimeException。此块没有“catch”子句,因此会抛出异常而不会捕获


第二个catch与“try”块相关,而与“catch”块无关。

我猜您可能想做的是:

    try { // code that throws subclass of Exception
        throw new ChildExceptionClass("try");
    } catch (ChildExceptionClass ex) {
      try {
            throw new RuntimeException(ex.getMessage());
       } catch (Exception ex) {
        System.out.println(ex.getMessage());
       }   
    }

你明白其中的区别吗?

但是我们也可以用catch(Exception ex)块捕获RuntimeException,那么为什么它没有被捕获,你能解释一下或者给出任何你想给出的例子吗?不,我只是想理解为什么第二个代码不起作用,因为根据我的理解,我们可以在catch块中捕获RuntimeException,但不能在多个catch块中同时发生。第二个catch块是多个catch块的一部分,将仅在第一个未使用的情况下使用。这是否意味着我无法捕获任何异常,如果它是从catch块抛出的,并且应该使用另一个父try/catch块或调用方方法try/catch捕获它。我不确定这是什么意思。我可以说的是,使用多个catch块的工作方式是这样的:如果从“try”块抛出异常,则第一个catch块将尝试使用。如果捕获到异常,则不会使用其他catch块(即使会从catch块抛出rexception)。如果未捕获异常,则第二个catch块将被触发以供使用,依此类推。希望现在清楚了。