>  기사  >  Java  >  Java에서 return 및 finally 문의 실행 순서는 무엇입니까?

Java에서 return 및 finally 문의 실행 순서는 무엇입니까?

PHPz
PHPz앞으로
2023-04-25 19:55:061875검색

소스 코드:

public class ReturnFinallyDemo {     public static void main(String[] args) {         System.out.println(case1());     }      public static int case1() {         int x;         try {             x = 1;             return x;         } finally {             x = 3;         }     } }  # 输出

위 코드의 출력은 간단히 결론을 내릴 수 있습니다. return이 finally 전에 실행됩니다. 바이트코드 수준에서 무슨 일이 일어나는지 살펴보겠습니다. 다음은 case1 메소드의 바이트코드 일부를 가로채서 소스 코드와 비교하여 각 명령어의 의미를 주석으로 표시합니다.

iconst_1 // 将常量1推入操作数栈顶  istore_0 // 弹出栈顶元素(1),保存到局部变量表slot[0],此时slot[0]=1。这两条指令对应源码:x = 1;  iload_0 // 将局部变量表slot[0]的值推入操作数栈顶,也就是说把上面x的值推入栈顶  istore_1 // 弹出栈顶元素(1),保存到局部变量表slot[1],此时slot[1]=1。其实,此时就已经把要return的值准备好了  iconst_3 // 将常量3推入操作数栈顶,这一条指令开始,其实是开始执行finally中的代码了  istore_0 // 弹出栈顶元素(3),保存到局部变量表slot[0],此时slot[0]=3。这两个指令对应源码:x = 3;这里要注意的是,虽然都是更新了x的值,但是finally中的x和try中x的赋值,保存在了不同的局部变量表中 iload_1 // 将局部变量表slot[1]的值推入操作数栈顶,此时栈顶元素的值为1,是第3行指令保存的值  ireturn // 将操作数栈顶的值返回给调用方

바이트코드를 보면 finally 코드가 먼저 실행되는 것으로 보입니다. 왜냐하면 ireturn 명령어가 실제로 in 마지막으로 실행되므로 반환된 값은 누가 먼저 실행했는지에 따라 달라지지 않고 ireturn 명령어에 의해 반환된 피연산자 스택의 최상위 요소가 저장되는 시점에 따라 달라집니다. 위의 코드 환경에서는 try 코드 블록의 x에 할당된 버전, 즉 return 문 바로 뒤에 저장된 x의 버전입니다.

좀 더 복잡한 시나리오를 살펴보겠습니다.

public static int case2() {     int x;     try {         x = 1;         return ++x;     } finally {         x = 3;     } }  # 输出

위의 분석을 통해 이해하기 쉽습니다. 바이트코드를 살펴보겠습니다.

iconst_1 // 将常量1推入操作数栈顶 istore_0 // 弹出栈顶元素(1),保存到局部变量表slot[0],此时slot[0]=1。这两条指令对应源码:x = 1; iinc          0, 1 // 对局部变量表slot[0]进行自增(+1)操作,此时slot[0]=2,对应源码:++x;所以,可以看出return后面的表达式先执行 iload_0 // 将局部变量表slot[0]的值推入操作数栈顶,也就是说把上面x的值(2)推入栈顶 istore_1 // 弹出栈顶元素(2),保存到局部变量表slot[1],此时slot[1]=2。其实,此时就已经把要return的值准备好了 iconst_3 // 将常量3推入操作数栈顶,这一条指令开始,其实是开始执行finally中的代码了 istore_0 // 弹出栈顶元素(3),保存到局部变量表slot[0],此时slot[0]=3。这两个指令对应源码:x = 3;这里要注意的是,虽然都是更新了x的值,但是finally中的x和try中x的赋值,保存在了不同的局部变量表中 iload_1 // 将局部变量表slot[1]的值推入操作数栈顶,此时栈顶元素的值为2,是第6行指令保存的值,也就是经过++x之后的值 ireturn // 将操作数栈顶的值返回给调用方

위 코드에서 볼 수 있듯이 반환 후 명령은 다음과 같습니다. 먼저 실행한 후 지역 변수 테이블에 저장한 다음 마지막으로 의 명령문을 실행하고 마지막으로 반환 명령 자체를 실행합니다.

요약하자면, return 명령이 마지막에 실행됩니다. return 뒤에 표현식이 있으면 표현식이 실행된 후에 finally의 명령문이 실행되고, return 명령이 마지막에 실행됩니다. 따라서 어느 것이 먼저 실행되는지, 마지막으로 또는 return이 실행됩니다. return 명령어 뒤에 표현식이나 메서드 호출이 있으면 먼저 실행되고, 마지막으로, 마지막으로 return 명령어가 실행됩니다. 위의 프로그램 데모 결과와 마찬가지로 x에 대한 할당만으로는 최종 반환 결과를 판단할 수 없습니다. 명령어 수준에서 x에 대한 두 개의 할당은 로컬 변수 테이블의 서로 다른 위치에 저장됩니다.

마지막으로 일반적으로 다음과 같이 작성되지 않는 시나리오를 살펴보겠습니다.

public static int case3() {     int x;     try {         x = 1;         return ++x;     } finally {         x = 3;         return x;     } } # 输出

최종적으로 결과를 반환하는 예입니다. 바이트코드 관점에서 분석해 보면 일반적으로 권장되지 않습니다.

위 내용은 Java에서 return 및 finally 문의 실행 순서는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제