2011-09-11 110 views
3
public class D { 

void myMethod() { 
    try { 
     throw new IllegalArgumentException(); 
    } catch (NullPointerException npex) { 
     System.out.println("NullPointerException thrown "); 
    } catch (Exception ex) { 
     System.out.println("Exception thrown "); 
    } finally { 
     System.out.println("Done with exceptions "); 
    } 
    System.out.println("myMethod is done"); 
} 

public static void main(String args[]) { 
    D d = new D(); 
    d.myMethod(); 
} 

}尝试,catch和finally块

我不明白怎么来的也被打印"myMethod is done"。抛出异常,所以它假设找到匹配的catch并执行finally块,但它继续执行myMethod方法并打印myMethod is done,它不是finally块的一部分。为什么?

回答

9

这就是try-catch-finally是如何工作的。因为你发现了这个异常,所以它被认为已经处理完毕,并且正常执行。

如果你还没有抓到它,或者重新抛出了它,那么“myMethod完成”就不会被打印出来,并且这个异常会冒出来,直到它被抓到其他地方。

请注意,finally总是执行,例外或否。

2

您处理了异常,所以方法处理继续。

1

你已经发现了异常,这意味着它不会再传播。 try语句之后立即执行,这是打印myMethod is done的语句。

1

从技术上讲,您已经处理了异常,因此执行仍在继续。

1

大概它说“异常抛出”,然后“完成异常”,然后“myMethod完成”。这就是它应该做的。

因为你自己在捕捉异常,它只会在整个try-catch-finally块完成后继续执行。这是一个捕获声明的重点。

5

在另一方面,如果你有以下:

void myMethod() { 
    try { 
        throw new IllegalArgumentException(); 

     System.out.println("Line after exception"); /// new line added here 

    } catch (NullPointerException npex) { 
        System.out.println("NullPointerException thrown "); 
    } catch (Exception ex) { 
        System.out.println("Exception thrown "); 
    } finally { 
        System.out.println("Done with exceptions "); 
    } 
    System.out.println("myMethod is done"); 
} 

public static void main(String args[]) { 
    D d = new D(); 
    d.myMethod(); 
} 

然后 “以后,线路例外” 打印。

+0

感谢您的澄清! – Numerator