try catch finally 세 사람의 실행 순서

우리 가 문 제 를 풀 때 시간 이 지나 면 try 에 관 한 문제 형 을 만 나 서 그들의 집행 순 서 를 판단 하 게 할 것 입 니 다.오늘 제 가 여러분 께 정리 해 드 리 겠 습 니 다.그들의 집행 순 서 는 여러분 들 이 반드시 자세히 보 셨 으 면 좋 겠 습 니 다.
우리 먼저 예 를 하나 보 자.
public abstract class Test {
     
    public static void main(String[] args) {
     
        System.out.println(tryTest());
    }
     
    public static int tryTest(){
     
        int x = 10;
        try{
     
            x = 1;
            return x;
        }finally{
     
            x = 5;
        }
    }
}

  :x = 1

이 문제 에서 beforeFinally 에 들 어간 후에 x 를 초기 화하 고 try 블록 을 실행 합 니 다.그 중에서 1 을 x(x=1)에 부 여 했 습 니 다.try 가 return 까지 실 행 했 을 때 이 일 을 합 니 다.돌아 갈 결 과 를 임시 스 택 에 저장 합 니 다.프로그램 은 바로 돌아 가지 않 고 finally 프로그램 을 실행 합 니 다.x=5 를 실행 할 때 프로그램 은 x 의 값 만 덮어 씁 니 다.이 임시 스 택 의 값 을 업데이트 하지 않 습 니 다.실행 이 완료 되면 메 인 프로그램 에 알 립 니 다.finally{}이 실행 되 었 습 니 다.되 돌아 오 라 고 요청 할 수 있 으 면 임시 스 택 의 값 을 되 찾 습 니 다.
우 리 는 이 예 를 약간 바 꾸 었 다.
public abstract class Test {
     
    public static void main(String[] args) {
     
        System.out.println(tryTest());
    }
     
    public static int tryTest(){
     
        int x = 10;
        try{
     
            x = 1;
            return x;
        }finally{
     
            x = 5;
            return x;
        }
    }
}

  :x = 5

이 프로그램 이 finally{}를 실행 하기 전의 과정 은 이전 코드 와 같 지만 finally{}을 실행 할 때 변화 가 생 겼 습 니 다.x 는 여전히 덮어 씁 니 다.return x 를 실행 할 때 그 는 x 로 돌아 가 프로그램 을 끝 냅 니 다.
우 리 는 이 예 를 바 꾸 자.
public abstract class Test {
     
    public static void main(String[] args) {
     
        System.out.println(tryTest());
    }

    public static int tryTest() {
     
        int x = 10;
        try {
     
            x = 1 / 0;
            return x;
            }
            catch(Exception e) {
     
                System.out.println("     ");
                return x;
            }finally{
     
                x = 5;
                return x;
        }
    }
}
  :x = 5

이 프로그램 은 분명히 이상 이 발생 했 습 니 다.catch 의 이상 출력'이상 이 발생 했 습 니 다'를 실행 한 후에 도 이 프로그램 은 fianlly 를 계속 실행 한 다음 에 x 를 덮어 쓰 고 마지막 으로 x 를 되 돌려 줍 니 다.
우 리 는 이 예 를 다시 한 번 수정 합 시다.
public abstract class Test {
     
    public static void main(String[] args) {
     
        System.out.println(tryTest());
    }

    public static int tryTest() {
     
        int x = 10;
        try {
     
            x = 1 / 0;
            return x;
            }
            catch(Exception e) {
     
                System.out.println("     ");
                return x;
            }finally{
     
                x = 5;
               
        }
    }
}
  :x = 10

catch 의 return 결 과 는 임시 스 택 에 저 장 됩 니 다.finally 가 실 행 된 후에 이 값 을 되 돌려 줍 니 다.
우 리 는 결론 을 얻 을 수 있다.1.이상 이 있 든 없 든 finally 블록 에서 코드 가 실 행 될 것 이다.
2.try 와 catch 에 return 이 있 을 때 finally 는 실 행 됩 니 다.
3.finally 는 return 뒤의 표현 식 연산 후에 실 행 됩 니 다.
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 이후 4 곳 의 코드 가 더 이상 실행 되 지 않 습 니 다.이상 없 음:try 를 실행 하고 finally 를 다시 반환 합 니 다.
상황 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 이 있 기 때문에 미리 종료 합 니 다.
최종 결론:finally 가 존재 한다 면 try 나 catch 의 return 문 구 를 실행 하기 전에 finally 문 구 를 먼저 실행 합 니 다.finally 에 return 문구 가 있 으 면 프로그램 이 return 되 기 때문에 finally 의 return 은 반드시 return 될 것 입 니 다.주의:컴 파일 러 는 finally 의 return 을 warning 으로 실현 합 니 다.
잘못 이 있 으 면 가르쳐 주 십시오!

좋은 웹페이지 즐겨찾기