2010-11-24 5 views
100

catch 블록이 실행되고 두 번째 예외가 발생하더라도이 코드는 someVar으로 설정됩니까?새로운 Exception을 던져도 finally 블록이 실행됩니까?

public void someFunction() throws Exception { 
    try { 
     //CODE HERE 
    } catch (Exception e) { 
     Log.e(TAG, "", e); 
     throw new Exception(e); 
    } finally { 
     this.someVar= true; 
    } 
} 
+2

@GaryF – jax

+1

으로 표시된대로 예상대로 동작하지 않을 수있는 상황이 있기 때문에 최종 블록이 예외를 throw하거나 반환 할 경우 예상대로 실행되지 않을 수 있습니다. –

답변

128

예, finally 블록은 항상 경우를 제외하고 ... 실행 :

이 (가) 시도 - 캐치 finally 블록이 사망하거나
  • 당신은 System.exit(0);
  • 을 사용 중단되는 기본 VM은
    • 스레드 실행입니다 다른 방법으로 파괴
    • 기본이되는 하드웨어는 어떤 방법

    또한 사용할 수 없습니다 아울러, finally 블록의 메소드가 캐치되지 않은 예외를 throw하면 그 이후의 아무 것도 실행되지 않습니다 (즉, 예외는 다른 코드에서와 같이 throw됩니다). 이 문제가 발생하는 가장 일반적인 경우는 java.sql.Connection.close()입니다.

    제쳐두고, 내가 사용한 코드 샘플은 단지 예일 뿐이지 만 실제 로직을 finally 블록 안에 넣는 것에주의해야합니다. finally 블록은 반드시 리소스 클린업 (DB 연결 닫기, 파일 핸들 해제)을위한 것이지, 반드시 실행 로직을위한 것이 아닙니다. try-catch 블록 이전에 반드시 실행해야한다면 예외를 던질 수있는 무언가와 떨어져 있어야합니다. 의도가 거의 확실하게 기능적으로 동일하기 때문입니다.

  • +4

    철저한 목록에 +1 –

    +4

    "여기 try-catch-finally 블록을 실행하는 스레드가 [...] 중단되었습니다"라는 의미는 무엇입니까? 어쩌면 그 문서는 잘못 말한 것이지만, Thread.interrupt()는 try 블록이나 catch 블록에서 던져 지 던지 finally 블록을 건너 뛰지 않습니다. Thread.stop()처럼 좀 더 폭력적인 것을 의미하기 위해 "인터럽트 된"것을 사용합니까? –

    +0

    @Joe : 그렇습니다. 문서의 내용이 약간 잘못 표현 된 것 같습니다. 스레드의 활동이 일반적으로 중단된다는 의미입니다. – GaryF

    9

    예.

    documentation 참조 :

    (가) 마지막으로 항상 때 try 블록 종료를 실행 차단합니다.

    예외 :

    참고 : 다음 는 finally 블록이 실행되지 않을 수 또는 catch 코드가 실행되는 시도하는 동안 JVM이 종료합니다. 마찬가지로 코드를 실행하는 스레드가 중단되거나 이 종료되면 이라는 전체 응용 프로그램이 계속 실행 되더라도 finally 블록은 이 실행되지 않을 수 있습니다.

    1

    예. finally 블록은 Java VM을 중지하기 때문에 System.exit()을 호출하는 경우를 제외하고 항상 실행됩니다.

    +0

    종료 훅은 여전히 ​​System.exit() 이후에 호출되지만 기존의 비 시스템 스레드는 모두 중지됩니다. –

    0

    는 마지막으로 항상 무엇을 경우하는 것은 즉이

    • 시도 - 캐치 마침내
    • 자바는 강제하지 않는 체크되지 않은 예외, 오류 처리를 위해

    을 던졌습니다 블록에 상관없이 실행되지 않습니다. 이 이유 때문에 finally 블록에서 검사되지 않은 예외가 발생하고 처리가 수행되지 않으면이 지점 (오류가 발생한 부분) 아래에 작성된 코드가 실행되지 않습니다.

    그래서 항상 모든 예외를 처리하는 것이 좋습니다. 확인 또는 선택 취소 할 수 있습니다. 이렇게하면 검사되지 않은 예외가 발생하더라도 finally에서 코드 블록도 실행되도록 할 수 있습니다. 당신은 서브 네스트 캐치 장소를 가지며 마침내 필요한 작업을 완료하기 위해 블록합니다.

    관련 문제