java runtimeException结果

时间:2017-07-30 18:29:33

标签: java

这是我的代码:

public static void main(String[] args) {
    System.out.print("a");
    try {
        System.out.print("b");
        throw new IllegalArgumentException();
    } catch (IllegalArgumentException e) {
        System.out.print("c");
        throw new RuntimeException("1");
    } catch (RuntimeException e) {
        System.out.print("d");
        throw new RuntimeException("2");
    } finally {
        System.out.print("e");
        throw new RuntimeException("3");
    }
}

我无法理解为什么输出是abce和RuntimeException(“3”)

3 个答案:

答案 0 :(得分:3)

当您缩进代码时,这一点就变得清晰了:

try {
  System.out.print("b");
  throw new IllegalArgumentException();
} catch (IllegalArgumentException e) {
  System.out.print("c");
  throw new RuntimeException("1");
} catch (RuntimeException e) {
  System.out.print("d");
  throw new RuntimeException("2");
} finally {
  System.out.print("e");
  throw new RuntimeException("3");
}

重点是:只有一个尝试块。然后采用第一个 catch块。那个抛出 - 而这个异常1就是你在堆栈跟踪中注意到的那个。

但事情是:最后块抛出异常1的“顶部”。因此,您会看到异常3。

换句话说:你的结局存在误解。您可能认为异常1应该被第二个 catch块捕获。那是错的。第二个阻止块涵盖第一个try块。含义:来自 catch 块的异常不会导致另一个 catch块被占用。第一个捕获块“触发”,最后一个块“触发” - 导致观察到的结果。

答案 1 :(得分:0)

虽然可以有多个catch()块,但在抛出异常时最多会执行1 catch()。之后它将执行finally阻止,因此您有abce的输出和RuntimeException阻止{。}}。

答案 2 :(得分:0)

这是因为,在try块中抛出IllegalArgumentException之后,它会被捕获到相应的catch(IllegalArgumentException e){}块中。最后,无论异常如何执行块,都会打印出来。

对于你的问题,由于异常已经在catch块中被捕获,它将相应地抛出相应的异常,并且它将被传播到该方法的调用者。