try와finally 블록의return 문제
상황1:try{}catch(){}finally{}return;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;
} catch (Exception e) {
System.out.println("error :" + e);
} finally {
if (b > 25) {
System.out.println("b>25 :" + b);
}
System.out.println("finally");
}
return 101; //---4
}
}
분명히 프로그램이 순서대로 실행되고 마지막return101이 종료됩니다:
yes b>25 :111 finally 101
상황2:try{return;}catch(){} finally{} return;
public class Test{
public static void main(String[] args){
System.out.print(tt());
}
public static int tt(){
int b = 23;
try{
System.out.println("yes");
b += 88;
return b; //---1
}catch(Exception e){
System.out.println("error :" + e);
}finally{
if(b>25){
System.out.println("b>25 :"+b);
}
System.out.println("finally");
}
return 101; //---4
}
}
프로그램은try 블록의return 이전 (return 문장의 표현식 연산 포함) 코드를 실행합니다.finally 블록을 다시 실행하고 마지막으로try에서return을 실행합니다.finally 블록 다음의 문장, 여기 4곳의return. 프로그램이 1곳의return에 있기 때문에 더 이상 실행하지 않습니다.결과:
yes b>25 :111 finally 111
상황 3:try {} catch () {return;}finally{} return;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;
} catch (Exception e) {
System.out.println("error :" + e);
return b; //---2
} finally {
if (b > 25) {
System.out.println("b>25 :" + b);
}
System.out.println("finally");
}
return 101; //---4
}
}
프로그램이 먼저try를 실행하고, 이상이 발생하면catch 블록을 실행합니다. 이상이 있으면catch에서return을 실행하기 전 (return 문장의 표현식 연산 포함) 코드를 실행하고finally 문장의 모든 코드를 실행하고, 마지막으로catch 블록에서return을 실행합니다.finally 이후 4곳의 코드가 더 이상 실행되지 않습니다.이상 없음:try를 실행한 다음finally를 실행한 다음return.결과: 이번에는 이상이 없는 결과입니다(물론 본 예시에는 디자인 이상이 없습니다).
yes b>25 :111 finally 101
상황 4:try {return;}catch(){} finally{return;}
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;
return b; //---1
} catch (Exception e) {
System.out.println("error :" + e);
} finally {
if (b > 25) {
System.out.println("b>25 :" + b);
}
System.out.println("finally");
return 100; //---3
}
}
}
프로그램은try 블록의return 이전 (return 문장의 표현식 연산 포함) 코드를 실행합니다.finally 블록을 다시 실행합니다. finally 블록에return이 있기 때문에 미리 종료합니다.결과:
yes b>25 :111 finally 100
상황 5:try{}catch(){return;}finally{return;}
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;
} catch (Exception e) {
System.out.println("error :" + e);
return b; //---2
} finally {
if (b > 25) {
System.out.println("b>25 :" + b);
}
System.out.println("finally");
return 100; //---3
}
}
}
프로그램이catch 블록에서return을 실행하기 전(return 문장의 표현식 연산 포함) 코드를 실행합니다.finally 블록을 다시 실행합니다.finally 블록에return이 있기 때문에 결과를 미리 종료합니다.
yes b>25 :111 finally 100
상황 6:try {return;}catch(){return;} finally{return;}
public class Test{
public static void main(String[] args){
System.out.print(tt());
}
public static int tt(){
int b = 23;
try{
System.out.println("yes");
b += 88;
return b; //---1
}catch(Exception e){
System.out.println("error :" + e);
return b; //---2
}finally{
if(b>25){
System.out.println("b>25 :"+b);
}
System.out.println("finally");
return 100; //---3
}
}
}
프로그램은try 블록의return 이전 (return 문장의 표현식 연산 포함) 코드를 실행합니다.이상이 있습니다:catch 블록의return을 실행하기 전 (return 문장의 표현식 연산 포함) 코드를 실행합니다.finally 블록을 다시 실행합니다.finally 블록에 리턴이 있기 때문에 미리 종료하면 이상이 없습니다:finally 블록을 다시 실행합니다.finally 블록에 리턴이 있기 때문에 미리 종료하면 이상이 없습니다:
yes b>25 :111 finally 100
다음 상황1:try{}catch(){}finally{}return;상황2:try{return;}catch(){} finally{} return;상황3:try{}catch(){return;}finally{} return;상황 4:try {return;}catch(){} finally{return;} 상황 5:try{}catch(){return;}finally{return;} 상황 6:try {return;}catch(){return;} finally{return;}
상기 몇 가지 상황은 다음과 같다. 첫째,try catch finally 블록이 모두return이 없으면 마지막finally 밖의return을 실행한다.만약try catch finally 중 어느 것이return이 있다면 마지막finally 밖의 return은 실행하지 않습니다.2. finally 블록에 리턴이 있으면try 또는catch에 리턴이 실행되지 않습니다
다음 몇 가지 상황은finally 블록 뒤에 리턴이 나타날 수 없습니다.상황:try{}catch(){}finally{return;}return;상태:try{return;}catch(){} finally{return;} return;상황:try{}catch(){return;}finally{return;} return;상태:try{return;}catch(){return;} finally{} return;상태:try{return;}catch(){return;} finally{return;} return;
위의 몇 가지 상황은finally 블록에 리턴이 있고 실행해야 하기 때문에finally 밖의 리턴은 실행할 수 없기 때문에 컴파일러가 오류를 알립니다.특수한try{return;}catch(){return;} finally{} return;try와catch에return이 있기 때문에 반드시 그 중 하나를 실행해야 하기 때문에finally 밖의 return은 실행할 수 없기 때문에 컴파일러가 오류를 알립니다.
또 다른 경우는 다음과 같습니다.
최종 결론:try나catch의return문장을 호출하기 전에finally문장을 먼저 실행합니다.finally가 존재한다면.만약finally에return 문장이 있다면 프로그램은return이 됩니다. 그래서finally의return은 반드시return에 의해 만들어집니다. 컴파일러는finally의return을warning으로 실현합니다.
본 논문은 CSDN 블로그에서 왔으며, 전재는 출처를 밝혀 주십시오: http://blog.csdn.net/samsunge808/archive/2009/03/02/3951159.aspx
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.