나는 지난 이틀 동안 예외 메커니즘을 배웠는데, 그 중 try...catch...finally가 중요한 부분이라고 생각합니다. 이전에 배운 내용과 관련하여 return and finally라는 흥미로운 문제에 직면했습니다. 실험을 통해 저는 이 논리적 관계가 정말 미묘하다는 사실을 발견했습니다. 다음은 제 의견입니다. 잘못된 점이 있으면 지적해 주시기 바랍니다.
먼저 첫 번째 코드 부분을 살펴보세요.
공개 클래스 return_finally{ 공개 정적 void main(String[] args){ System.out.println( m_1() ) } 공개 정적 int m_1(){ int i=10; ); return i+=10; }catch(Exception e){ System.out.println( "error: "+e ) }finally{ if(i>10){ System.out.println( i ); } System.out.println( "최종적으로" ) return i;
첫 번째 코드 조각의 출력은 다음과 같습니다.
시작
20
마지막으로
20
이때 두 번째 return은 finally 문 외부에 있다는 점에 유의하세요. return과 finally가 동시에 나타나는 규정에 따르면 첫 번째 return은 단지 finally 문을 찾는 기능일 뿐이라는 것을 알 수 있습니다. 실제로는 i+= 10 연산만 실행한 다음 finally 문을 직접 입력하고 마지막으로 결과를 반환합니다.
두 번째 코드 부분을 살펴보겠습니다.
공개 클래스 return_finally{ 공개 정적 void main(String[] args){ System.out.println( m_1() ) } 공개 정적 int m_1(){ int i=10; ); return i+=10; }catch(Exception e){ System.out.println( "error: "+e ) }finally{ if(i>10){ System.out.println( i ); } System.out.println( "최종적으로" ) return } } }
두 번째 코드 조각과 첫 번째 코드 조각의 차이점은 최종 반환이 finally 문에 배치된다는 것입니다. 출력 결과를 추측할 수 있습니다.
시작
20
마지막으로
50
이때 실행된 return은 이전 연산 결과에서 얻은 20을 덮어쓰고 50의 값을 반환했습니다. 즉 finally 문의 return이 실행된 것입니다.
세 번째 코드도 있습니다. 천천히 즐겨보세요.
공개 클래스 return_finally{ 공개 정적 void main(String[] args){ System.out.println( m_1() ) } 공개 정적 int m_1(){ int i=10; ); return i; }catch(Exception e){ System.out.println( "error: "+e ) }finally{ if(i>10){ System.out.println( i ); } System.out.println( "최종적으로" ) } return i;
이때 finally 문에 추가로 i=50이 있는데 결과는 어떻게 될까요?
시작
마지막으로
10
finally 문에는 return 문이 없으므로 원래 반환 값은 변경되지 않습니다.
따라서 이 세 가지 예를 통해 다음과 같이 이해할 수 있습니까?
try 문에서 return을 만나면 먼저 해당 위치에 값을 저장한 후 finally 문을 찾아보고, 문에 새로운 알고리즘이 있으면 그 공간에서 값을 꺼내서 연산을 수행합니다. 마지막으로 return을 입력하면 "새 값"을 해당 공간에 덮어쓰고 결국 반환됩니다. finally에 반환이 없으면 해당 공간에서 "이전 값"을 꺼내서 반환하면 됩니다.
위의 내용은 순전히 이해를 돕기 위한 것입니다. 더 많은 조언을 주실 수 있기를 바랍니다. 도움을 주셔서 감사합니다!