try,catch和finally的执行顺序是啥[重复]

Posted

技术标签:

【中文标题】try,catch和finally的执行顺序是啥[重复]【英文标题】:What is the order of execution in try,catch and finally [duplicate]try,catch和finally的执行顺序是什么[重复] 【发布时间】:2013-12-30 13:16:16 【问题描述】:

如果我们在try中给出这样的return语句,执行顺序是什么

try
--- ----
-----
return a;


catch

finally

这里如果try中有return,执行顺序是什么。请告诉我

【问题讨论】:

为什么不自己试试呢?这很容易测试。 【参考方案1】:

在对 return 语句求值之后,最后总是被执行。

【讨论】:

嗯,return 语句中的表达式仍然会在finally 子句之前进行计算。【参考方案2】:

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2

finally 总是执行。如果try中有return,则trycatch的其余部分不执行,则finally执行(从最里面到最外面),然后函数退出。

【讨论】:

不准确。如果 System.exit() 被调用或 JVM 崩溃,finally 将不会被执行.. 是的,如果您将计算机从墙上拔下,它也不会执行。也是同样的情况,没必要出线。 @Widdershins 或者如果恐龙会吃掉你的机器。但是调用System.exit() 是您应该注意的情况。 (我同意 JVM 崩溃..) @Maroun Maroun 是的,尽管老实说 System.exit() 的执行方式,但它本质上是内部引发的系统崩溃。可能是关闭任何 Java 应用程序的最肮脏的方式,它似乎无法保证在调用它之后可以完成多少工作,除非你有一个关闭钩子,它非常非常小心地join()ing 你必须完成的任务。我有一个应用程序在调用System.exit(0) 时尚未转储许多兆字节的文件,并且很难或不可能完成它。老实说,最好不要打电话给System.exit() @Maroun Maroun 看起来像关闭钩子joining 必须完成的任务被认为是阻塞陷阱并将被终止;您必须确保您的关闭挂钩实际上自己完成工作。所以我想通了。我仍然认为exit() 是关闭机器的不好方法,如果您有更好的处理方法,应该避免使用它。【参考方案3】:

无论finally 是什么情况,都会一直执行。 如果try 成功执行,它将不会执行catch 块。如果try 块抛出异常然后catch 块将执行

【讨论】:

【参考方案4】:

通常try-catch-finally的顺序执行顺序首先是try,然后如果exception trows and catched will execute the catch.无论是否捕获到异常finally 将始终执行。

如果return 在您的try 中,则在try 中的执行将停止并执行finally。如果exceptionreturn 之前抛出并捕获,则将遵循正常的执行顺序。

让我们运行以下代码

public static void main(String[] args) 
    String[] arr=getInfo();
    for(String i:arr)
        System.out.println(i);
    


public static String[] getInfo()
    String[] arr=new String[3];
  try 
      arr[0]="try";
      return arr;
  catch (Exception e)
      arr[1]="catch";
      return arr;
  finally 
      arr[2]="finally";
      return arr;
  

输出

try // return in try
null
finally // returning value in finally.  

现在这个输出解释了你想要的每一件事。 finallytry 中有return 时运行。

如果你的try 中有System.exit(0)finally 将不会执行。

【讨论】:

您在设置数组的值时指定顺序,很自然,这就是顺序【参考方案5】:

如果 try 中有返回,则控制将转到 finally 块,执行当前代码然后退出。因此在此期间,如果在 finally 块中,try 中返回的任何变量都有任何变化,如果在 finally 中返回相同的变量,则将返回最新的。

try 
             i = 11;
             return i;
             catch (Exception e) 
                // TODO: handle exception
             finally

                i = 12;
                return i; --> This will be returned
            
        //return i;


     

但是如果只有修改,finally中没有rerun,try中返回的值就是最终值。

 try 
             i = 11; --> this will be returned
             return i;
             catch (Exception e) 
                // TODO: handle exception
             finally

                i = 12; -- this will be executed

            
        //return i;


     

【讨论】:

【参考方案6】:

try-catch 处理中,当您return 来自try 块时,它将超出try-catch-finally.. 的范围,因为catch 块只接受try.. 抛出的内容。返回的东西,现在当你从 try 块返回时,它不会到达 try 结束并且最终不会被执行,它将退出 try-catch-finally 块,回到你的代码。

【讨论】:

以上是关于try,catch和finally的执行顺序是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章

try-catch-finallyjava异常捕获的三种格式以及finally和return的执行顺序

异常处理 try...catch...finally 执行顺序, 以及对返回值得影响

try-catch-finally的执行顺序

try-catch-finally的执行顺序

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

try catch finally 中 returne的执行顺序