역사상 가장 명확한 설명: 리턴이 있는 상황에서try catch finally의 실행 순서(보고 모르면 내가 진다!)

4602 단어 java 기초

우선, 결론을 직접 말하자면: (반드시 예와 테스트 프로그램을 보아야 한다!)


1. 나무에 이상이 생기든finally 블록의 코드가 실행됩니다.
2,try와catch에return이 있을 때finally는 여전히 실행됩니다.
3. finally는return 뒤에 있는 표현식 연산 후에 실행된 것이다(이때 연산 후의 값을 되돌려주지 않고 먼저 되돌려줄 값을 저장한다.finally의 코드가 어떻든지 간에 되돌려주는 값은 변하지 않고 이전에 저장한 값임에도 불구한다). 따라서 함수 되돌려주는 값은finally가 실행되기 전에 확정된 것이다.
4,finally에return을 포함하지 않는 것이 좋습니다. 그렇지 않으면 프로그램이 미리 종료됩니다. 반환값은try나catch에 저장된 반환값이 아닙니다.

예:


상황1:
try{
        
} catch() {
        
} finally {
        
} 
return;

분명히 프로그램은 순서대로 집행된다.
상황2:
try { 
    return;//①
} catch() {

} finally {

} 
return;//②

프로그램은try 블록에서 ①return 이전 (①return 문장의 표현식 연산 포함) 코드를 실행합니다.
finally 블록을 다시 실행하고 마지막으로try에서 ①return을 실행합니다.
finally 블록 다음 문장 ② return,try에서 ① return이 실행되지 않기 때문에 실행되지 않습니다.
상황 3:
try {

} catch() {
    return;//①
} finally {

} 
return;//②

프로그램 순서는try를 먼저 실행하고 이상 실행catch 블록에 이상이 있으면:catch에서 ①return 이전 (①return 문장의 표현식 연산 포함) 코드를 실행하고finally 문장의 모든 코드를 실행하며 마지막으로catch 블록에서 ①return을 실행합니다.finally 이후인 ② return 코드는 더 이상 실행되지 않습니다.이상 없음:try를 실행한 다음finally를 실행한 다음return
상황4:
try { 
    return;//①
} catch() {

} finally {
    return;//②
}

프로그램은try 블록에서 ①return 이전 (①return 문장의 표현식 연산 포함) 코드를 실행합니다.
finally 블록을 다시 실행합니다.finally 블록에 ②return이 있기 때문에 미리 종료합니다.
상황 5:
try {

} catch() {
    return;//①
} finally {
    return;//②
}

프로그램이catch 블록에서 ①return 이전 (①return 문장의 표현식 연산 포함) 코드를 실행합니다.
finally 블록을 다시 실행합니다.finally 블록에 ②return이 있기 때문에 미리 종료합니다.
상황6:
try {
    return;//①
} catch() {
    return;//②
} finally {
    return;//③
}

프로그램은try 블록에서 ①return 이전 (①return 문장의 표현식 연산 포함) 코드를 실행합니다.이상 있음:catch 블록에서 ②return을 실행하기 전 (②return 문장의 표현식 연산 포함) 코드를 실행합니다.finally 블록을 다시 실행합니다.finally 블록에 ③ return이 있기 때문에 미리 종료합니다.이상 없음:finally 블록을 다시 실행합니다.finally 블록에 ③ return이 있기 때문에 미리 종료합니다.

최종 결론:


try나catch의return 문장을 실행하기 전에finally 문장을 실행합니다.finally가 존재한다면.만약finally에return 문장이 있다면 프로그램은return이 됩니다. 그래서finally의return은 반드시return에 의해 만들어집니다. 컴파일러는finally의return을warning으로 실현합니다.
 

다음은 테스트 프로그램입니다.


테스트 프로그램①
public static int method_1() {
    int a = 1;
    try {
        return a;
    } catch (Exception e) {
        System.out.println("11");
    } finally {
        ++a;
        return a;
    }
}

결과: 2
테스트 절차 ②
public static int method_2() {
    int a = 1;
    try {
        int  u = 1/0;
        return a;
    } catch (Exception e) {
        System.out.println("11");
    } finally {
        ++a;
        return a;
    }
}

결과:112
테스트 프로그램 ③
public static int method_3() {
    int a = 1;
    try {
        int  u = 1/0;
        return a;
    } catch (Exception e) {
        System.out.println("11");
        return a;
    } finally {
        ++a;
    }
}

결과
테스트 프로그램 ④
public static int method_4() {
    int a = 1;
    try {
        return a;
    } catch (Exception e) {
        System.out.println("11");
    } finally {
        ++a;
    }
    return a;
}

결과: 1
테스트 프로그램 ⑤
public static int method_5() {
    int a = 1;
    try {
        int u = 1 / 0;
        return a;
    } catch (Exception e) {
        System.out.println("11");
        return a + 1;
    } finally {
        ++a;
        System.out.println("22");
    }
}

결과: 11 22 2
테스트 프로그램 ⑥
public static int method_6() {
    int a = 1;
    try {
        int u = 1 / 0;
        return a;
    } catch (ArithmeticException e) {
        System.out.println("11");
        return a + 1;
    } catch (Exception e) {
        System.out.println("22");
        return a;
    } finally {
        ++a;
    }
}

결과:112
테스트 프로그램
public static int method_7() {
    int a = 1;
    try {
        int u = 1 / 0;
        return a;
    } catch (NullPointerException e) {
        System.out.println("11");
        return a + 1;
    } catch (Exception e) {
        System.out.println("22");
        return a;
    } finally {
        ++a;
    }
}

결과:221

분석:


try 문장에서return 문장을 실행할 때 되돌아갈 결과가 준비되어 있습니다. 이 때 프로그램은finally로 넘어가서 실행됩니다.돌리기 전에try에서 되돌려받을 결과를 a와 다른 국부 변수에 저장하고finally를 실행한 후에 되돌려받을 결과를 꺼냅니다. 따라서finally에서 변수 a를 바꾸더라도 되돌려받는 결과에 영향을 주지 않기 때문에 창고에서 되돌려받는 값을 사용해야 합니다.

좋은 웹페이지 즐겨찾기