try catch finally return运行顺序

首先让我们搞懂两组概念:try catch finally和return

1.try catch finally

首先说try catch,

(1)try语句 ,try语句用来包围可能出现异常的代码片段. try是发现问题的语句,发现异常后会跳入到catch{}中,如下:

try{

可能出现异常的代码片段

}

(2)catch语句 ,catch语句是用来捕获try语句中出现的异常,并针对该异常解决的.catch语句块可以出现多次.

catch(Exception_Type e){

解决问题的代码片段

}

(3)finally块 ,finally出现在try语句的最后 ,finally块中的语句是必然执行的,无论try中是否出现异常.
finally{

代码片段
}

2.return

两个作用:

(1)一般的就是用在有反回值的方法中,用来返回方法指定类型的值,同时结束方法执行;

(2)也可以用在返回值为void的方法中,用来终止方法运行;return ;

3.对于以上有个基本的认识就不怕搞不懂try catch finally return运行顺序,下面以代码为例:

public static void main(String[] args) {
  String str = null;
  System.out.println(demo(str));
 }

(1)无finally时:

(1.1)

public static String demo(String str){
    try {
        System.out.println(str.charAt(1)); //构造异常
        return "1";

} catch (Exception e) {
        return "2";
    }

}

运行结果:2(无异常返回1,程序结束;出现异常时,返回2,程序结束)

(1.2)

public static String demo(String str){
    try {
        System.out.println(str.charAt(1)); 
    } catch (Exception e) {
        return "2";

}
   return "4";

}

运行结果:2(无异常返回4,程序结束;出现异常时,返回2,程序结束)

(1.3)

public static String demo(String str){
  try {
   System.out.println(str.charAt(1)); 
   return "1";
  } catch (Exception e) {
  }
  return "4";
 }

运行结果:4(无异常返回1,程序结束;出现异常时,程序跳到catch中什么也没做,接着往下运行,return "4",程序结束)

(1.4)

public static String demo(String str){
  try {
   return "1";
  } catch (Exception e) {
  }
  return "4";
 }

运行结果:1(程序自上而下运行, return "1",程序结束)

其他情况不再一一赘述。。。

(2)有finally时:

(2.1)

public static String demo(String str){

try {
        System.out.println(str.charAt(1)); 
        return "1";
    } catch (Exception e) {
        return "2";
    }
    finally{
       return "3";
    }
}

(2.2)

public static String demo(String str){
    try {
        return "1";
    } catch (Exception e) {
        return "2";
    }
    finally{
        return "3";
    }
}

注意:存在finally时,一单finally里面有return 语句,那么无论之前return过什么(是否出现异常),均被覆盖成finally里面的值(而且,finally里面一旦有return,马上返回,程序结束,不再运行以下的程序),如上两个例子均返回3:只不过(2.1)是先2后3,(2.2)是先1后3

(3)其他情况:

(3.1)

public static String demo(String str){
    try {
        System.out.println(str.charAt(1)); //异常处
        return "1";
    } catch (Exception e) {
        try {
            throw new Exception(e);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return "2";
   }
}

运行结果:2,这是因为程序在异常处发生异常,直接跳到外层catch{}中,而在catch中尽管又进行了一次try catch,但是程序在catch{}中是自上而下可以运行到return "2";处,返回,程序结束

(3.2)

public static String demo(String str){
    try {
        System.out.println(str.charAt(1)); 
        return "1";
    } catch (Exception e) {
        try {
            throw new Exception(e);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return "2";
  }
  finally{
      return "3";
  }
}

运行结果:3,此运行过程前面与上个例子相同,知道return"2"后面,会跳出外层catch{},运行finally{},在此中遇到return "3",返回,程序结束

以上是我的简单总结,若有错误,欢迎批评指正,转载时请注明作者及来源,谢谢

时间: 2024-11-08 21:25:23

try catch finally return运行顺序的相关文章

有return的情况下try catch finally的执行顺序

http://www.cnblogs.com/lanxuezaipiao/p/3440471.html?cm_mc_uid=89442383850615035911861&cm_mc_sid_50200000=1505491196 1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么

有return的情况下try catch finally的执行顺序(最有说服力的总结)

结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值.举例:情况1:try{}

try catch finally的执行顺序(有return的情况下)

结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值. 举例:情况1:try{

有return的情况下try catch finally的执行顺序(转)

结论: 1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的: 4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值. 举例: 情况1

有return的情况下try catch finally的执行顺序(转)

结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值.举例:情况1:try{

[转]有return的情况下try catch finally的执行顺序

结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的: 4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值. 举例: 情况

Java_try,catch,finally return之间的执行顺序

以往认为函数只要执行到return语句便会返回结果并终止,然而这时错误的,因为这存在特例. 掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行. 2. 函数执行完try块中的return语句后不会终止,还会继续执行catch(仅在抛出异常时执行).finally语句块. 3.函数必须确保有唯一返回值 说明: try中如果包含return语句则catch块

java实例化对象时程序运行顺序

当java实例化对象时,首先先进行类加载,类加载的整个过程是将类字节码引入内存,并未类中的static变量赋值.上篇文章已经大概分析了类的加载机制,下面讲一下类的实例化过程. 首先引入示例代码 父类 package test; public class Fu { public int j = 9; public static int i = 10; static{ i = 9; System.out.println("Fu静态代码块"); } { j = 10; System.out.

Eclipse下printf和scanf的运行顺序问题

Eclipse下printf和scanf的运行顺序问题 Eclipse  宇托  2011-12-25  662浏览  去评论 在写一个C语言时,运行时发现scanf比printf先执行了,在网上找了一下资料,原来是输出缓冲区的问题.解决方法有两个,第一,设置缓冲区为空,即没有缓冲区:第二,每执行printf之后,强制缓冲区.具体方法如下: 在printf之前添加:setvbuf(stdout,NULL,_IONBF,0);设置缓冲区为空. 在每句printf之后添加:fflush(stdout