try、catch、finally与return

1 try catch finally语句基础知识

  1. finally一定会被执行。
  2. try块发生异常才会执行catch块。
  3. 如果finally块中抛出异常,则整个try、catch、finally块中抛出异常。

 

 

 

2 try catch finally语句与return语句

1、finally块一定会被执行。即使已经执行了return语句。

例:

public class Test{
    public static String func(){
        Integer i=0;
        try{
            System.out.println("执行try语句块");//1
            return i.toString();//2
        }finally{
            System.out.println("开始执行finally语句块,i的值为:"+i);//3
            i++;//4
            System.out.println("结束执行finally语句块,i的值为:"+i);//5
        }
    }

    public static void main(String[] args) {
        System.out.println("开始执行main");//0
        System.out.println("执行func的结果为:"+func());//5
        System.out.println("结束执行main");//6
    }
}

 

输出:

开始执行main
执行try语句块
开始执行finally语句块,i的值为:0
结束执行finally语句块,i的值为:1
执行func的结果为:0
结束执行main

 

 

从该例可看出,外层代码先获取方法的返回值,等待方法内部finally语句执行结束后,外层方法继续执行。即try、catch、finally语句中,执行return后,对当前返回的值做任何的修改,都不影响已经return的返回值。

 

 

2、try块中有return语句,catch块中也必须有return语句。否则无法通过编译。

 

return语句在try-catch-finally块之前。显然这会提示异常,提示去除try{}catch(){}finally{}块。

 

由于return一般都处于代码块执行的最后。所以若try块抛出异常,则return语句肯定还未执行。异常被catch捕获,catch必须完成try没有完成的return。

 

 

3、如果finally块中有return 语句,则返回try或catch中的返回语句忽略。

public class TryCatchFinally {

    

    static int method(){

        try{

            return 0;

        }catch(Exception e){

            return 1;

        }finally{

            System.out.println("finally{}");

            return 2;

        }

    }

    

    public static void main(String[] args) {

        int i = method();

        System.out.println(i);

    }

}

 

输出:

finally{}

2

 

 

finally中有return语句,编译器会提示警告。

 

 

 

3 使用try、catch、finally语句块中需要注意

1、尽量在try或者catch中使用return语句。通过finally块中达到对try或者catch返回值修改是不可行的。

2、finally块中避免使用return语句。因为finally块中使用return语句会显示的消化掉try、catch块中的异常信息,屏蔽了错误的发生。

3、finally块中避免再次抛出异常。否则整个包含try语句块的方法回抛出异常,并且会消化掉try、catch块中的异常。

 

 

posted @ 2013-11-26 08:28  LaplaceDemon  阅读(338)  评论(0编辑  收藏  举报