关于Java中的try-catch-finally语句和return

第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)

  第二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四:

  1、return语句只在函数最后出现一次。

  2、return语句仅在try和catch里面都出现。

  3、return语句仅在try和函数的最后都出现。

  4、return语句仅在catch和函数的最后都出现。

  注意,除此之外的其他做法都是不可行的,编译器会报错。

  (1)如果程序运行到try成功时可以返回结果,则采用方法2。(见下面的例子test0_1,在那个例子中,方法2和4都是可行的,但是推荐方法2?)

  (2)如果程序运行到catch时(即中途出错时)无需再继续执行后面的代码了,则采取方法4;(见下面例子中的test0,在那个特殊的例子中,只能采取方法4)

  (3)如果程序运行到try或catch时还需要继续执行后面的代码,则采取方法1(见下面的例子test0_2,该例子只能采用方法1)。

  下面是测试代码:


public class Test {

    public static void main(String[] args) {
        System.out.println("=============test1==================");
        System.out.println(test1());
        System.out.println("===============================");

        System.out.println("=============test1_1==================");
        System.out.println(test1_1());
        System.out.println("===============================");

        System.out.println("\n============test2===================");
        System.out.println(test2());
        System.out.println("===============================");

        System.out.println("\n============test2_1===================");
        System.out.println(test2_1());
        System.out.println("===============================");

        System.out.println("\n============test3===================");
        System.out.println(test3());
        System.out.println("===============================");

        System.out.println("\n============test3_1===================");
        System.out.println(test3_1());
        System.out.println("===============================");
    }

    public static String test0() {
     String a;
     int b;
     try{
      b = 8/0;
     }catch(Exception e){
      return null;
     }
     a = String.valueOf(b);
     return a+b;
    }
 
    public static String test0_1() {
     String a;
     int b;
     try{
      b = 8/0;
      a = String.valueOf(b);
         return a+b;
     }catch(Exception e){
      return null;
     }
     //return a+b;
    }
   
    public static String test0_2() {
     String a;
     int b=0;
     try{
      b = 8/0;
     }catch(Exception e){
     }
     a = String.valueOf(b);
     return a;
    }
   
    public static String test1() {
        String a = "in try";
        int n = -1;
        try{
            return a+n; //先执行这个,再执行finally
        } catch ( Exception e ) {

        } finally {
         //对String和int的更改均无效
            a = "in finally";
            n = 123;
            System.out.println("do finally");
        }
        return a; //不会执行
    }  //总结出一点:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally

    public static String test1_1() {
        String a = "in try";

        try{
            return a;
        } catch ( Exception e ) {

        } finally { //从eclpise报警告可看出,finally里面不建议有return语句
            a = "in finally";
            System.out.println("do finally");
            return a; //注释掉这句,eclipse将不再警告
        }
    }

    public static int test2() {
        int a = 1;

        try{
            return a;
        } catch ( Exception e ) {

        } finally {
            a = 2;
            System.out.println("do finally");
        }

        return a;
    } //很显然,finally里面更改无效,返回的是a=1

    public static int test2_1() {
        int a = 1;

        try{
            return a;
        } catch ( Exception e ) {

        } finally {
            a = 2;
            System.out.println("do finally");
            return a;
        }
    } //很显然,a取finally里面的值,a=2

    //Helper类,将整数转换成字符串
    static class Helper {
        int a;

        public String toString() {
            return String.valueOf(a);
        }
    }
   
    public static Helper test3() {
        Helper h = new Helper();
        h.a = 1;

        try{
            return h;
        } catch ( Exception e ) {

        } finally {
            h.a = 2; //对h.a的更改起作用!!
              //因为在try里面返回的是一个句柄,它指向的对象的内容 是可以改变的
            System.out.println("do finally");
        }
       
        return h; //这个不会被执行
    }

    public static Helper test3_1() {
        Helper h = new Helper();
        h.a = 1;

        try{
            return h;
        } catch ( Exception e ) {

        } finally {
            h.a = 2; //返回a=2,这个不用说了
            System.out.println("do finally");
            return h;
        }
    }

    /**
     * 总结:
     * return语句,finally里面不建议放return语句,根据需要,可以放在try和catch里面
     *
     */
   
}

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-28 07:44:38

关于Java中的try-catch-finally语句和return的相关文章

java中异常处理try~catch~finally介绍

1.异常: 1.1:错误和异常是两个概念:错误是需要避免的,而异常是你能预见到的并且能掌控的了 得 1.2:处理异常:用try...catch...finally 用throw,就得用throws来修饰方法名 public void sayHello() throws Exception{}这样写,如果在别的方法 中想要调用这个方法,要么用try..catch捕获异常,要么throws Exception交给下一个用它的方法. 1.3:try{如果这里面的语句出现错误,那么将不执行下一句,直接跳

java中如何使用这条语句last_insert_id()得到最后插入记录的ID值

问题描述 比如Stringsql="insertintomembervalues(?,?)";PreparedStatementpstmt=conn.getPstmt(sql);pstmt.setInt(1,0);pstmt.setString(2,username);intflag=pstmt.executeUpdate();id=last_insert_id()就是这一句如何写,我想得到插入记录的ID值,赋值给id 解决方案 解决方案二:selecttop1idfrommember

Java中异常机制的深入研究

由于本文旨在探讨Java"异常机制"的深层原理,因此关于"异常"的使用方法都不做详细说明.首先看一段非常熟悉的用于打开一个文件的C程序段: FILE *fp;fp=fopen(filename,"rw");if(fp==NULL){ printf("cannot open file\n"); exit(0);} 在这段程序中,if条件语句中的一段用来处理没有找到指定文件,或者其它原因无法正确打开指定文件.可是如果遇到一个责任心

java-Java中,finally在try语句块中的return前执行还是后执行

问题描述 Java中,finally在try语句块中的return前执行还是后执行 为什么finally没有改变变量a的值.求大神解答 解决方案 1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行

全面了解Java中对于异常的捕捉方法_java

1. try-catch语句 在Java中,异常通过try-catch语句捕获.其一般语法形式为: try { // 可能会发生异常的程序代码 } catch (Type1 id1){ // 捕获并处置try抛出的异常类型Type1 } catch (Type2 id2){ //捕获并处置try抛出的异常类型Type2 } 关键词try后的一对大括号将一块可能发生异常的代码包起来,称为监控区域.Java方法在运行过程中出现异常,则创建异常对象.将异常抛出监控区域之 外,由Java运行时系统试图寻

java中过滤重复

问题描述 在java中过滤重复用sql语句过滤时间selectdistinct(d.usertime)fromDatainfo..保存在session中,但是在页面取的时候报错,${itemUser.usertime} 解决方案 解决方案二:查询出来的集合中应该不是实体对象,而是Object[]解决方案三:那怎么用呢解决方案四:查询单个字段,给你个例子,好好看看吧Stringusername=(String)session.createSQLQuery("selectdistinct(d.use

java中的常量为什么不能在try catch语句中赋值?

问题描述 java中的常量为什么不能在try catch语句中赋值? 成员位置声明一个常量,想在try catch 语句中赋值,会报错,不明白为什么会这样 解决方案 常量可以在try catch中赋值的,try这种就相当于一个语句块,只是提供了对异常的处理而已. 解决方案二: try-catch语句try-catch语句匿名类,try-catch语句 解决方案三: java中的常量声明时就需要初始化赋值.常量是始终不变的量,不能改变其常量值 解决方案四: 声明常量时就需要初始化赋值,不然会报错:

Java中finally语句与return语句的执行次序

Java finally语句到底是在return之前还是之后执行? 网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有Sy

Java中异常处理之try和catch代码块的使用_java

Java try和catch的使用 尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常.这样做有两个好处.第一,它允许你修正错误.第二,它防止程序自动终止.大多数用户对于在程序终止运行和在无论何时错误发生都会打印堆栈轨迹感到很烦恼(至少可以这么说).幸运的是,这很容易避免. 为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了.紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句.完成这个任务很简单,下面的程序包含一个

谈谈Java中try-catch-finally中的return语句_java

我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的函数中,仅仅是一个return语句(return ;),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种情况下return语句后不能再有其它的语句了. 在try-catch-finally语句中使用return语句遇到了一些疑问 代码一: static int intc(){ int x =0; try{ x=1; return x; }finally { x = 3;