关于java:try,catch和finally的执行顺序是什么

What is the order of execution in try,catch and finally

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
try{
--- ----
-----
return a;
}

catch{
}
finally{
}

这里是什么样的执行顺序,如果有回报在尝试。请告诉我


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执行(从内到外),然后函数退出。


首先,你需要去获取文档并正确理解这个概念,你可以参考这些文档。

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

在StackOverflow上,没有人应该解释,因为这个站点基本上不是一个完整的目的。


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


如果try中有返回,则控件将转到finally块,执行存在的代码,然后退出。因此,在此期间,如果finally块中对try中返回的变量有任何更改,并且如果finally中返回相同的变量,则返回最新的变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
try {
             i = 11;
             return i;
            } catch (Exception e) {
                // TODO: handle exception
            } finally{

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


     }

但是如果只有修改,最终没有重试,那么在try中返回的值将是最终值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 try {
             i = 11; --> this will be returned
             return i;
            } catch (Exception e) {
                // TODO: handle exception
            } finally{

                i = 12; -- this will be executed

            }
        //return i;


     }


通常情况下,try-catch-finally的命令执行命令是先执行try,然后如果exception特洛伊并被抓获,execute将执行catch。如果捕获异常或未捕获异常,则始终执行finally

如果你的try中有return,那么try中的执行将在那里停止,并将执行finally。如果exception在该return之前抛出并捕获,那么将遵循正常的执行命令。

让我们运行以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
  }
}

输出

1
2
3
try // return in try
null
finally // returning value in finally.

现在这个输出解释你想要的每件事。finally运行,而try中有return运行。

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


无论情况如何,finally将始终执行。如果成功执行try块,则不会执行catch块。如果try块抛出异常,那么catch块将执行


在对返回语句进行评估之后,始终执行finally。