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会发生什么
为什么我们在未处理的异常后进入finally {}?
我们总是finally在块退出之后(成功地,在异常处理程序之后,或在未处理的异常之后).这正是finally为了什么:一个放置代码的地方,无论如何.
但是,ArrayIndexOutOfBoundException会发生什么?
如果在异常处理程序或finally块中遇到第二个异常,则将传播该第二个异常并隐藏原始异常.
如果要保留原始异常,可以通过手动将其附加到新异常Throwable#addSuppressed(或者反过来,重新抛出原始异常并将新异常作为抑制附加).
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |