`
T240178168
  • 浏览: 362630 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

try、catch、finally、return的执行顺序

    博客分类:
  • java
阅读更多
try、catch、finally、return的执行顺序
public class JVMTest {

public static void main(String[] args){
System.out.println("aa:" + aa());
}
public static int aa(){
int a = 1;
int b = 10;
try{
System.out.println("abc");
return a;
}finally{
a = 2;
System.out.println("a: "+ a);
}
}
}

运行结果为:

abc
a: 2
aa:1

由此可知:在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。

在转去之前,try中先把要返回的结果存放到不同于a的局部变量中去,执行完finally之后,在从中取出返回结果,

因此,即使finally中对变量a进行了改变,但是不会影响返回结果。

但是,如果在finally子句中最后添加上return a会怎样呢?

执行结果如下:

Compiling 1 source file to E:\sun\InsideJVM\build\classes
E:\sun\InsideJVM\src\JVMTest.java:37: warning: finally clause cannot complete normally
}
1 warning
compile-single:
run-single:
abc
a: 2
aa:2
测试1:
    public static int test1()
    {
        int i = 1;
        try
        {
            return ++i;
        }
        finally
        {
            ++i;
            Console.WriteLine("finally:" + i);
        }
    }
    static void Main(string[] args)
    {
        Console.WriteLine("Main:" + test1());
    }
结果:
finally:3
Main:2
________________________________________
测试2:
    public static int test2()
    {
        int i = 1;
        try
        {
            throw new Exception();
        }
        catch
        {
            return ++i;
        }
        finally
        {
            ++i;
            Console.WriteLine("finally:" + i);
        }
    }
    static void Main(string[] args)
    {
        Console.WriteLine("Main:" + test2());
    }
结果:
finally:3
Main:2
________________________________________
测试3:
    public static int test3()
    {
        try{}
        finally
        {
            return 1;
        }
    }
结果:
编译错误,控制不能离开 finally 子句主体。
________________________________________
结论:
1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.finally块中的语句是在return语句执行之后才执行的,即函数返回值是在finally块中语句执行前确定的;
4.finally块中不能包含return语句。
总结:finally在return前执行,在finally的操作,不会改变已经确定的return的值,
finally不能加return语句。出现异常,先找是否有处理器可以处理这个异常.再finally。

Finally里面可以有返回语句,也可以执行,但是eclipse中会有警告。因为这样的话,finally中的return会覆盖掉正常和非正常return的信息,导致用户无法判断当前的情况。
分享到:
评论

相关推荐

    try、catch、finally、return 执行顺序.doc

    try、catch、finally、return 执行顺序超详细讲解,包看包会。

    try-catch-finally执行顺序验证

    try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...

    try catch finally的执行顺序深入分析

    首先执行try,如果有异常执行catch,无论如何都会执行finally,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出

    Jungle68#-#[Java] try catch finally,try里有return,finally还执行么?1

    Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据

    try~catch~finally中关于return的问题

    在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视

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

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

    try-catch-finally-return-in-finally.rar_return

    The production IfStatement : if ( Expression ) Statement else Statement is evaluated as follows:.

    Java中finally块执行与return关系深度剖析

    Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。

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

    我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的函数中,仅仅是一个return语句(return ;),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种...

    java面试题之try中含return语句时代码的执行顺序详解

    主要介绍了关于java中的一道面试题,这套题就是在try中含return语句时代码的执行顺序,这个问题看似简单,却暗藏杀机啊!文中通过一个个例子详细介绍了其中玄机,需要的朋友可以参考学习,下面来一起看看吧。

    java大厂面经、直击BAT

    finally 一定会被执行,如果 finally 里有 return 语句,则覆盖 try/catch 里的 return , 比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种...

    trycatchfinaly

    3. 但是如果有 finally块的话,那么,finally 几乎是必定会执行的,但是这里有一个先后顺序的问题,应该是 finally 块和 打印异常堆栈将会在另外一个线程之中执行,所以 打印的顺序就很有意思了。 4. 如果在try或者...

    josonle#Coding-Now#finally语句如何执行1

    - 无论try是否发生异常,finally语句都会执行- 如果try/catch中包含控制转移语句(return、continue、break),finally

    VB.Net常用语法

    一:Try………Catch………finally………end try 捕获错误 把一个可能出错的语句放在try后面,如果出错,执行catch语句, catch可以有多个,第一个catch不能捕获的错误,将被下一个catch语句 所捕获。在所有的处理...

    浅谈Python中的异常和JSON读写数据的实现

    异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try … catch … finally来处理异常,在Python中通过try … except … else来处理异常 一、以ZeroDivisionError为例,处理分母为...

    asp.net 系统

    ublic SqlConnection lianjie()//数据库链接 { ... try { com.ExecuteNonQuery();//执行sql命令 return true; } catch { return false; } finally { con.Close();//关闭数据库 }

    毕业就业-刷题库Java面试题大全(2021年-2022年).rar

    8. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 9. 类 ExampleA 继承 Exception,类 ExampleB 继承ExampleA。 10. 常见的 RuntimeException 有哪些? 11. Java常见异常有哪些 四、并发...

    finally 一定会执行(实例代码)

    @SuppressWarnings(finally) static int compute (){ Exc e = new Exc(); e.a = 10; e.b = 10; int res = 0 ; try{ res = e.a / e.b; System.out.println(try ……); return res + 1; }catch...

    AST反混淆js还原工具2.3(20231219)

    03 try-catch优化为try-catch-finally简化 04 辅助功能-return简写表达式还原,便于阅读理解 05 新增:大数组多解密函数(需要先自行排版,大数组-偏移函数-解密函数1-解密函数2-解密函数3) 06 修复bug-未修改常量...

    ASP.NET类库.rar

    try { Fsm = File.OpenRead(filename); return this.ConvertStreamToByteBuffer(Fsm); } catch { return new byte[0]; } finally { Fsm.Close(); } } else { return new byte[0]; } }

Global site tag (gtag.js) - Google Analytics