try와finally 블록의return 문제

7015 단어 .net면접 시험Blog
이 질문은 자광 면접을 보러 갔을 때 물어본 질문입니다.
상황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

좋은 웹페이지 즐겨찾기