return finally 누가 작용하는지

2243 단어 finally
인터넷에서try{}catch{}finally{}에return을 첨가한 후의 집행 순서에 대한 토론을 보았는데, 뜻밖에도 자신이 예시 테스트를 썼는데, 과정과 결론은 다음과 같다.try{}catch{}finally{} 프로그램에서 이상이 발생하든지 아니든try나catch 문장 블록에 어떤 코드가 포함되어 있든지 ("System.exit ()";제외)finally 문장 블록의 코드가 실행됩니다.그러나try 문장 블록에return 문장이 포함될 때 실행 순서가 약간 다르다.장면 1:
public class TestFinally ...{

    public static void main(String[] args) ...{
        System.out.print(returnValue());
    }
    
    public static int returnValue()...{
        int i = 0;                // L1
        try...{                
            i = 1;                // L2
            return i = i + 5;    // L3
        } finally ...{            
            i = 2;                // L4
        }
    }
}

returnValue () 방법의 문장 실행 순서는 'L1, L2, L3, L4, L3' 이고 마지막으로try 문장 블록의return 문장을 실행하지만,returnValue () 의 반환 값은 6입니다.finally 문장 블록에서 변수 i에 대한 부여 값이 작용하지 않는 것처럼 보이지만, 실제로 Debug를 실행하면finally 문장 블록을 실행한 후에return 문장으로 돌아갈 때 변수 i의 값이 새 값 2인 것을 발견할 수 있습니다. 그런데 왜return의 값은 6입니까?개인적으로는 L3을 실행할 때마다 실제로return을 실행하지 않고'i=i+5'를 실행했기 때문이라고 분석했다.(이때 i=6) 임시 변수'xTemp = i;'에 i 값을 저장합니다.(xTemp==6), 그리고finally의 "i=2;"를 실행,마지막으로try 문장 블록의return 문장을 실행합니다. 실제로는 "return xTemp;"입니다.
그래서finally 블록을 실행했지만 효과가 없는 것 같습니다.시나리오 2:
public class TestFinally ...{

    public static void main(String[] args) ...{
        System.out.print(returnValue());
    }
    
    public static int returnValue()...{
        int i = 0;                // L1
        try...{                
            i = 1;                // L2
            return i = i + 5;    // L3
        } finally ...{            
            i++;                  // L4
            return i;            // L5
        }
    }
}

이때returnValue () 방법의 문장 집행 순서는 'L1, L2, L3, L4, L5' 이고 마지막으로finally 문장 블록의return 문장을 집행하며 되돌아오는 값은 7이다.즉try문장 블록의return문장의'i=i+5;'실행되었습니다. 마지막으로finally 문장 블록의return 문장으로 되돌아갑니다.try 문장 블록의return 되돌아오는 기능은 작동하지 않습니다.기사 출처:http://www.diybl.com/course/3_program/java/javajs/2007917/71604.html

좋은 웹페이지 즐겨찾기