【问题标题】: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,执行顺序是什么。请告诉我

【问题讨论】:

  • 为什么不自己试试呢?这很容易测试。

标签: java exception


【解决方案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 块,回到你的代码。

      【讨论】:

        猜你喜欢
        • 2013-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多