try catch finally 문장 블록에return 문장이 존재할 때의 실행 프로세스

3262 단어 Java 기반필기
제목: 다음 코드 실행 결과는 ()
public class Test{ 
    public int add(int a,int b){   
         try {
             return a+b;      
         } 
        catch (Exception e) {  
            System.out.println("catch   ");
         }
         finally{ 
             System.out.println("finally   ");
         }
         return 0;
    } 
     public static void main(String argv[]){ 
         Test test =new Test(); 
         System.out.println("  :"+test.add(9, 34)); 
     }
}

옵션:
A、 catch                B、              C、finally           D、  :43
    :43                                           :43                finally   

운행 결과를 이해하지 못하는 학생들은 다음 두 단락의 코드를 인내심을 가지고 보면try catch finally 문장 블록에return 문장이 존재할 때의 운행 절차가 확연히 밝아진다.
Code one:
public abstract class Test {
    public static void main(String[] args) {
        System.out.println(beforeFinally());
    }
     
    public static int beforeFinally(){
        int a = 0;
        try{
            a = 1;
            return a;
        }finally{
            a = 2;
        }
    }
}
/**output:
1
*/

코드의 운행 결과를 보면'finally'의 문장은try 문장 블록인'return'이후에 실행된 것 같지만, 사실은 그렇지 않다. 실제로'finally'의 문장은'return'이전에 실행된 것이다.그러면 문제가 생겼습니다. 기왕 전에 실행한 이상, 왜 'a' 의 값이 덮어쓰이지 않았습니까?
프로세스 분석:try 문장 블록의return 방법을 실행할 때, 프로그램이 이 일을 할 것입니다. 되돌아올 결과를 임시 창고에 저장한 다음, 프로그램은finally 문장 블록의 프로그램을 실행하지 않습니다. 'a = 2' 를 실행할 때, 프로그램은 a의 값을 덮어쓰지만 임시 창고의 되돌아올 값을 업데이트하지 않습니다.실행이 끝난 후에 메인 프로그램'finally의 프로그램이 실행되었음을 알립니다. 되돌려달라고 요청할 수 있습니다. '라고 알립니다. 이 때 임시 창고의 값을 꺼내서 되돌려줍니다.이제 되돌릴 값은 임시 창고에 저장되어 있음을 분명히 알 수 있을 것이다.
Code two:
public abstract class Test {
    public static void main(String[] args) {
        System.out.println(beforeFinally());
    }
     
    public static int beforeFinally(){
        int a = 0;
        try{
            a = 1;
            return a;
        }finally{
            a = 2;
            return a;
        }
    }
}
/**output:
2
*/

코드 원과는 달리 현재finally 문장 블록에도 리턴 문장이 있습니다. 이 리턴을 실행할 때 임시 창고의 값을 업데이트합니다.마찬가지로finally를 실행한 후에 메인 프로그램에 요청이 돌아왔음을 알리고 임시 창고의 값을 꺼내서 되돌려줍니다.그러므로 반환치는 2이다.
이제 고개를 돌려 처음의 코드를 살펴보자.
public class Test{ 
    public int add(int a,int b){   
         try {
             return a+b;      
         } 
        catch (Exception e) {  
            System.out.println("catch   ");
         }
         finally{ 
             System.out.println("finally   ");
         }
         return 0;
    } 
     public static void main(String argv[]){ 
         Test test =new Test(); 
         System.out.println("  :"+test.add(9, 34)); 
     }
}

프로세스 분석: ① 16행 코드는 문자열 결합이 하나의 전체이기 때문에dd 방법의 연산 결과를 얻어야만 출력할 수 있다.그러므로 D 옵션을 제외합니다.② try와catch 두 문장 블록이 동시에 존재할 때try에 return 문장이 있으면 뒤에 try catch finally 문장 블록 이외의 return 문장은 작용하지 않고 컴파일러도 "Unreachable code"오류를 보고하지 않습니다.여러분은 컴파일러를 열어 보셔도 됩니다.그러므로 B 옵션을 제외합니다.③ try 블록에 런타임 예외가 없으므로 A 옵션을 제외합니다.④ finally 문장 블록의 문장이return 문장보다 먼저 실행되기 때문에 컨트롤러에서'finally 문장 블록'을 출력한 다음return 문장을 실행하여 연산 결과를 되돌려줍니다.마지막으로 메인 프로그램으로 돌아가서 문자열 연결이 출력 '과 43' 을 완성합니다.그러므로 정답은 C다.
 
 

좋은 웹페이지 즐겨찾기