finally 코드 블록의 실행 상황

3688 단어
  • [x]try에return이 있는데finally가 실행됩니까?그럼 이try 뒤에 있는finally {}에 있는 코드가 실행될지, 언제 실행될지,return 앞에서나 뒤에서
  • [x]finally 코드 블록을 실행하기 전에 방법이 결과를 되돌려주거나 JVM이 종료되면finally 블록의 코드가 실행됩니까
  • [x]어떤 상황에서finally문장이 실행되지 않습니다
  • 1. try에return,finally가 있는데 어떻게 실행합니까

  • finally 블록의 코드는return 이전에 실행됩니다.

  • 이상 처리에서try나catch를 실행하든finally{}의 코드는 실행됩니다. (특수한 경우를 제외하고는)프로그램이 리턴을 실행하는 것은 현재 함수에 대한 호출을 끝내고 이 함수체를 뛰어넘는 것을 의미하기 때문에, 어떤 문장도 리턴 전에만 실행할 수 있습니다.
    public class Test {
        public static int testFinally() {
            try {
                return 1;
            } catch (Exception ex) {
                return 2;
            } finally {
                System.out.println("execute finally");
            }
        }
        public static void main(String[] args) {
            int result = testFinally();
            System.out.println(result);
        }
    }
    
    

    실행 결과:
    execute finally
    1
    
  • 또한try-catch-finally에 리턴이 있으면finally 블록의 리턴은 다른 리턴 문장을 덮어쓰고 최종적으로 호출자에게 리턴의 값으로 돌아갑니다.
  • public class Test {
        public static int testFinally() {
            try {
                return 1;
            } catch (Exception ex) {
                return 2;
            } finally {
                System.out.println("execute finally");
                return 3;
            }
        }
        public static void main(String[] args) {
            int result = testFinally();
            System.out.println(result);
        }
    }
    

    실행 결과:
    execute finally
    3
    

    return 문장이 반드시 함수의 출구는 아닙니다. return을 실행할 때, return 뒤의 값을 반환값 변수에 복사했을 뿐입니다.
  • 또한try/catch에return이 있을 때finally 블록에서 기본 형식을 바꾸는 데이터는 반환값에 아무런 영향을 주지 않는다.finally에서 인용 형식을 바꾸는 데이터는 반환 결과에 영향을 미칠 수 있습니다.
  • /**
     * try/catch  return, finally{}         、            
     */
    public class Test {
        public static int testFinally1() {
            int result1 = 1;
            try {
                return result1;
            } catch (Exception ex) {
                result1 = 2;
                return result1;
            } finally {
                result1 = 3;
                System.out.println("execute testFinally1");
            }
        }
        public static StringBuffer testFinally2() {
            StringBuffer result2 = new StringBuffer("hello");
            try {
                return result2;
            } catch (Exception ex) {
                return null;
            } finally {
                result2.append("world");
                System.out.println("execute testFinally2");
            }
        }
        public static void main(String[] args) {
            int test1 = testFinally1();
            System.out.println(test1);
            StringBuffer test2 = testFinally2();
            System.out.println(test2);
        }
    }
    

    실행 결과:
    execute testFinally1
    1
    execute testFinally2
    helloworld
    

    프로그램은return을 실행할 때 먼저 반환값을 지정한 위치에 저장하고finally 블록을 실행하며, 가장 먼저return을 실행합니다.
    finally 블록에서 기본 형식의 데이터result1/인용 형식 데이터result2의 값을 바꾸면 자바의 값 전달과 인용 전달과 관련이 있습니다.값 전달에서 형삼과 실삼은 서로 다른 저장 단원을 가지고 형삼의 변화에 실삼의 값에 영향을 주지 않는다.인용 전달에서 전달된 것은 대상의 주소이고 인삼과 실삼의 대상은 같은 저장 단원을 가리키며 인삼의 변화에 영향을 줄 수 있다.

    2. finally 코드 블록을 실행하기 전에 방법이 결과를 되돌려주거나 JVM이 종료되면finally 블록의 코드가 실행됩니까//finally가 실행하지 않을 경우

  • java 프로그램의finally 블록이 반드시 실행되는 것은 아닙니다.적어도 두 가지 경우finally 문장은 실행되지 않을 것이다.

  • (1)try 문이 실행되지 않았습니다.즉try 코드 블록에 들어가지 않았기 때문에 대응하는finally는 자연히 실행되지 않습니다.
    예를 들어try문장 전에return이 되돌아와finally가 실행하지 않습니다.또는 프로그램이 자바에 들어가기 전에 이상이 발생하면 바로 끝납니다.finally 블록도 실행하지 않습니다.
    (2) try/catch 블록에 System이 있습니다.exit(0)를 사용하여 JVM을 종료합니다.
    System.exit(0)는 JVM을 종료하고 프로그램을 강제로 종료하며finally{}의 코드는 실행되지 않습니다.

    참조 자료:


    java에서finally 문장이 반드시 실행될지 여부
    Java의 매개변수 전송
    finally 코드 블록이 실행되지 않는 상황 요약

    좋은 웹페이지 즐겨찾기