Java未处理的异常消失

aig*_*guy 1 java exception try-catch-finally

假设有一个类:

public class Magic {

public static void main(String[] args){
    boolean[] val = new boolean[0];
    paradox(val);
}

private static boolean paradox(boolean[] arg) {
    Container container = null;
    try {
        container = Container.getContainer(arg[0]);
        return container.value;
    } catch (UnsupportedOperationException e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            container.sayHi();
        } catch (UnsupportedOperationException e) {
            e.printStackTrace();
        }
    }
}

private static class Container{
    private boolean value;

    private Container(boolean value){
        this.value = value;
    }

    private static Container getContainer(boolean value) throws UnsupportedOperationException{
        return new Container(value);
    }

    private void sayHi(){
        System.out.println("Hi!");
    }
}
}
Run Code Online (Sandbox Code Playgroud)

如果执行此代码,则会在其上引发空指针

container.sayHi();
Run Code Online (Sandbox Code Playgroud)

container实际上应该是空的.在赋值完成之前,当我们调用getContainer()时会抛出一个ArrayIndexOutOfBoundException.但是,ArrayIndexOutOfBoundException会发生什么?为什么我们在未处理的异常后进入finally {}?

编辑:可怜的措辞.问题是为什么我们直接进入finally {}.ArrayIndexOutOfBoundException会发生什么

Thi*_*ilo 6

为什么我们在未处理的异常后进入finally {}?

我们总是finally在块退出之后(成功地,在异常处理程序之后,或在未处理的异常之后).这正是finally为了什么:一个放置代码的地方,无论如何.

但是,ArrayIndexOutOfBoundException会发生什么?

如果在异常处理程序或finally块中遇到第二个异常,则将传播该第二个异常并隐藏原始异常.

如果要保留原始异常,可以通过手动将其附加到新异常Throwable#addSuppressed(或者反过来,重新抛出原始异常并将新异常作为抑制附加).