2014-06-03 8 views
-3

기능상의 차이가 있습니까?try/finally에서 try의 내용이 중요합니까?

Connection c = null; 
try { 
    c = getConnection(); 
    c.doStuff(); 
} finally { 
    if (c!=null) c.close(); 
} 

Connection c = null; 
c = getConnection(); 
c.doStuff(); 
try { 
} finally { 
    if (c!=null) c.close(); 
} 

Connection c = null; 
try { 
    c = getConnection(); 
} finally { 
    if (c!=null) c.close(); 
} 
c.doStuff(); 

대 나는 그들 모두가 모든 경우에 try-finally 블록의 외부에서 발생하는

+1

'시도'의 목적을 알고 있다면이 답변을 알 수 있습니다. 'try'에 넣지 않으면 예외를 잡을 수 없습니다. –

+0

당신은 예외 처리, 간단한 사건 돌봐, DB를 해제 해보십시오. –

+0

세 가지 예제는 매우 다른 동작을합니다. 'try' 블록의 외부에서 발생하는 예외는 처리되지 않은 예외에 대한 바로 정의입니다. 이 경우에'finally' 코드가 실행될 것 같지 않습니다. 마지막 예제에서는 연결을 사용하기 전에 연결이 닫힙니다. 유일한 예는 첫 번째 예입니다. – Craig

답변

1

예외를 같은 일을 할 것이라고 생각 정의에 따라 처리되지 않은 예외입니다. . 그렇다면 운영 체제 나 런타임이 어떻게 처리 할 것인지에 대한 어떠한 보장도하지 않습니다. 예외가 풀려나지 않을 가능성이 높습니다. 코드가 단순히 중단됩니다 (이상 종료 - "비정상 종료"). 그러면 finally 블록이 실행되지 않습니다.

try-finally은 코드 정리가 발생하고 올바른 컨텍스트에서 발생한다는 것을 보장합니다.

finally 블록의 코드가 무엇이든지 상관없이 항상 실행되고 전체 메서드가 완료된 후에 실행되기 때문에 다른 코드가 내부에 있는지 여부는 중요하지 않습니다. 또는 try-finally 구조 외부에 있지만 올바르지 않습니다.

올바른 동작을 보장하려면 런타임에 올바른 예가 하나뿐입니다. 첫 번째 예에서

  • , 당신은 취득하고 더 중요한 것은 사용 연결 try 블록 내부 (데이터베이스에, 하나는 가정 것이다). try 블록에서 예외가 발생하면 finally 블록이 실행되어 연결이 닫힙니다.

  • 두 번째 예에서는 연결을 획득하여 try-catch 구조 외부에서 완전히 사용합니다. 연결을 사용하여 예외가 발생하는 경우 전체 컨텍스트가 그냥 버려지기 때문에 finally 블록이 실행되지 않고 연결이 닫히지 않습니다. 세 번째 예에서

  • finallytry 후 실행하려고하지만, 한 finally 블록 다음에 오는 코드 전에. 연결이 이미 명시 적으로 닫혀 있기 때문에 연결을 사용하려고하면 예외가 생성됩니다.

2

크레이그는 이미 처리되지 않은 예외 문제를 해결했지만 분명히 밝히고 싶습니다. 예외가 발생한 후에 깨진 연결로 작업 할 수 있기 때문에 마지막으로 두 가지 예를 코딩했습니다. 그렇게하지 마십시오.여기

class TryCatchFinally { 
    static int [] array = new int[1]; 
    public static void main(String [] args) throws Exception { 
     if (args[0].startsWith("1")) { 
      version1(); 
     } else if (args[0].startsWith("2")) { 
      version2(); 
     } 
    } 
    static int version1() { 
     int r = 0; 
     try { 
      System.out.println("In Try."); 
      return array[1]; 
     } catch (Exception e) { 
      System.out.println("In Catch."); 
     } finally { 
      System.out.println("In Finally."); 
     } 
     System.out.println("In Return."); 
     return r; 
    } 
    static int version2() { 
     int r = array[1]; 
     try { 
      System.out.println("In Try."); 
     } catch (Exception e) { 
      System.out.println("In Catch."); 
     } finally { 
      System.out.println("In Finally."); 
     } 
     System.out.println("In Return."); 
     return r; 
    } 
} 

하여 실행된다 : 여기서 ArrayIndexOutOfBoundsException을, 간단한 예이다

(TryCatchFinally)$ javac *.java 
(TryCatchFinally)$ java TryCatchFinally 1 
In Try. 
In Catch. 
In Finally. 
In Return. 
(TryCatchFinally)$ java TryCatchFinally 2 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at TryCatchFinally.version2(TryCatchFinally.java:24) 
    at TryCatchFinally.main(TryCatchFinally.java:7) 
(TryCatchFinally)$ 

는 예외 상황에서 발생하여 예외 핸들러가 등록 된 최초 버전에서 볼 수 있듯이 try 블록의. 두 번째 버전에는 등록 된 예외 처리기가 없으며 기본 예외 처리기가 호출되었습니다 (포착되지 않은 예외를 의미 함).