try catch finally 세 사람의 실행 순서
13911 단어 자바프로 그래 밍 언어
우리 먼저 예 를 하나 보 자.
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 으로 실현 합 니 다.
잘못 이 있 으 면 가르쳐 주 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.