try{
    //执行的代码,其中可能有异常。一旦发生异常,则立即调到catch执行。否则不执行catch里面的内容。
    }catch{
    //除非try里执行代码发生了异常,否则这里的代码不会执行。
    }finally{
    //不管什么情况都会执行,包括try catch里面用了return,可以理解为只要执行了try或者catch,就一定会执行finally
    }

    1. public class test3 {
    2. public static void aMethod() throws Exception{
    3. try{
    4. throw new Exception();
    5. }finally{
    6. System.out.println("finally");
    7. }
    8. }
    9. public static void main(String[] args) {
    10. // TODO Auto-generated method stub
    11. try{
    12. aMethod();
    13. }catch(Exception e){
    14. System.out.println("exception");
    15. }
    16. System.out.println("finish");
    17. }
    18. }
    19. // finally exception finish

    总结:
    1.将预见可能引发异常的代码包含在try语句块中。
    2.如果发生了异常,则转入catch的执行。catch的几种写法:
    catch 这将捕获任何发生的异常
    catch(Exception e) 这将捕获任何发生的异常,使用e参数来获得有关异常的信息
    catch(Exception的派生类 e) 捕获派生类定义的异常
    catch可以有多个,也可以没有,每个catch可以处理一个特定的异常。按照catch的顺序查找异常处理块,如果找到,则进行处理,如果找不到,则向上一层次抛出。如果没有上一层次,则向用户抛出,此时,如果你在调试,程序将中断运行,如果是不熟的程序,将会终止。
    3.finally
    finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使自try块内用return返回了,finally总是要执行,以便最后做些清理工作,如关闭数据库连接等。
    注意:catch和finally必须存在一个

    1. public class FinallyDemo {
    2. public static void main(String[] args) {
    3. System.out.println(getInt());//40
    4. }
    5. public static int getInt() {
    6. int a = 10;
    7. try {
    8. System.out.println(a / 0);
    9. a = 20;
    10. } catch (ArithmeticException e) {
    11. a = 30;
    12. return a;
    13. /*
    14. * return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
    15. * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
    16. * 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
    17. */
    18. } finally {
    19. a = 40;
    20. return a; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
    21. }
    22. // return a;
    23. }
    24. }