Java Try Catch finally 블록은 Catch없이


125

새로운 코드를 검토 중입니다. 이 프로그램에는 try와 finally 블록 만 있습니다. catch 블록이 제외되었으므로 예외 또는 throw 가능한 항목이 발생하면 try 블록이 어떻게 작동합니까? finally 블록으로 직접 이동합니까?



25
@mP 모두가 코드 검토를해야하고 그들에게 질문하는 것은 배우고 개선하는 방법입니다.
Carl Pritchett 2011 년

답변:


130

try 블록의 코드 중 하나라도 확인 된 예외를 throw 할 수있는 경우 메서드 서명의 throws 절에 나타나야합니다. 확인되지 않은 예외가 발생하면 메서드에서 버블 링됩니다.

finally 블록은 예외 발생 여부에 관계없이 항상 실행됩니다.


11
첫 번째 단락이 반드시 사실은 아닙니다. Try 블록은 중첩 될 수 있습니다. 확인되지 않거나 확인되지 않은 포착되지 않은 예외는 메서드에서 버블 링됩니다.
Andy Thomas

4
Try 블록은 중첩 될 수 있지만 권장하지 않습니다. 나는 그런 식으로 코드를 작성하지 않습니다.
duffymo

2
@duffymo : "메소드에서 거품이 발생했다"는 의미는 무엇입니까?
TodayILearned

5
@Anand "예외 던지기"에 대한 약간 비 기술적 인 언어입니다.
duffymo

2
무시되지 않습니다. 메소드 체인을 전달하십시오.
duffymo 2016

93

try/ 에 대한 작은 참고 사항 finally: finally는

  • System.exit() 호출됩니다.
  • JVM이 충돌합니다.
  • try{}블록 결코 끝 (예를 들면 무한 루프).

4
어때 try{..} catch{ throw ..} finally{..}? 나는 마지막으로 실행되지 않습니다 생각
sbeliakov

10
이 경우 마침내 여전히 호출됩니다. 원래 예외 만 손실됩니다.
Peter Lawrey 2015

마지막으로 이전에 System.exit ()를 호출하면 실행되지 않습니다.
mmirror

2
@jyw 위 목록의 첫 번째 항목이 의미하는 바입니다.
Peter Lawrey

나는 이것이 모든 기지를 포함한다고 말해야한다!
Oscar Bravo

39

Java 언어 사양 (1)try-catch-finally 은 실행 방법을 설명합니다 . 캐치가없는 것은 주어진 Throwable을 캐치 ​​할 수없는 것과 같습니다.

  • 값 V가 던져 져서 try 블록의 실행이 갑자기 완료되면 다음과 같은 선택이 있습니다.
    • 런타임 유형 V를 try 문의 catch 절의 매개 변수에 할당 할 수있는 경우
      ……
    • 런타임 유형 V를 try 문의 catch 절의 매개 변수에 할당 할 수없는 경우 finally 블록이 실행 됩니다. 그런 다음 선택이 있습니다.
      • finally 블록이 정상적으로 완료되면 V 값이 발생하여 try 문이 갑자기 완료됩니다.
      • finally 블록이 이유 S로 인해 갑자기 완료되면 try 문이 이유 S로 인해 갑자기 완료됩니다 (그리고 값 V의 throw는 삭제되고 잊혀집니다).

(1) try-catch-finally 실행


16

내부 finally는 외부 블록에 예외를 던지기 전에 실행됩니다.

public class TryCatchFinally {

  public static void main(String[] args) throws Exception {

    try{
        System.out.println('A');
        try{
            System.out.println('B');
            throw new Exception("threw exception in B");
        }
        finally
        {
            System.out.println('X');
        }
        //any code here in the first try block 
        //is unreachable if an exception occurs in the second try block
    }
    catch(Exception e)
    {
        System.out.println('Y');
    }
    finally
    {
        System.out.println('Z');
    }
  }
}

결과

A
B
X
Y
Z

6

finally 블록은 try 블록이 정상적으로 종료되거나 예외로 인해 비정상적으로 종료되는지 여부에 관계없이 항상 try 블록이 종료 된 후에 실행됩니다.

try 블록 내의 코드에 의해 예외가 throw되면 현재 메서드는 finally 블록을 실행 한 후 동일한 예외를 다시 throw (또는 계속 throw)합니다.

finally 블록이 예외 / 오류 / throwable을 throw하고 이미 보류중인 throwable이있는 경우 추악합니다. 솔직히 말해서 나는 정확히 무슨 일이 일어나는지 잊어 버렸습니다. 내가 생각하는 두 throw 가능 객체가 서로 연결 얻을,하지만 당신이해야 할 몇 가지 특별한 부두가있다 (예 - 내가 찾아 볼 것 메소드 호출)은 "마지막으로"이렇게 되신, 어, 토하기 전에 원래의 문제를 얻을 수 있습니다.

덧붙여서, try / finally는 자바가 소멸자가 없기 때문에 리소스 관리를 위해 매우 일반적인 일입니다.

예-

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

"마지막으로"하나 더 팁 : 당신이 경우 않는 캐치에 넣어 귀찮게 어느 캐치 특정 (예상) 던질 수있는 서브 클래스, 아니면 그냥 캐치 '의 Throwable " 하지 일반적인 포괄 오류 트랩"예외 ". 리플렉션 구프와 같은 너무 많은 문제는 "예외"가 아닌 "오류"를 발생 시키며 다음과 같이 코딩 된 "모두 잡기"에 의해 바로 미끄러집니다.

catch ( Exception e) ...  // doesn't really catch *all*, eh?

대신 다음을 수행하십시오.

catch ( Throwable t) ...

추악한 부분에 대해서는 아래 Carlos Heuberger의 답변을 참조하십시오.
mplwork

3

버전 7 이전의 Java 버전에서는 이러한 세 가지 조합의 try-catch-finally ...

try - catch
try - catch - finally
try - finally

finally블록은 tryor / and catch블록 에서 무슨 일이 일어나 든 항상 실행 됩니다. 따라서 catch블록 이 없으면 여기서 예외가 처리되지 않습니다.

그러나 물론 응용 프로그램이 완전히 중단되는 것을 원하지 않는 한 코드 어딘가에 예외 처리기가 여전히 필요합니다. 핸들러가 정확히 어디에 있는지는 애플리케이션의 아키텍처에 따라 다릅니다.

  • Java try 블록 뒤에 catch 또는 finally 블록이 와야합니다.
  • 각 try 블록에는 0 개 이상의 catch 블록이있을 수 있지만 finally 블록은 하나만 있습니다.
  • finally 블록은 프로그램이 종료되면 (System.exit ()를 호출하거나 프로세스를 중단시키는 치명적인 오류를 유발하여) 실행되지 않습니다.

1
"버전 7 허용 이전"은 Java 7 및 Java 8이 이러한 세 가지 조합을 허용하지 않는다는 의미입니까? 그게 무슨 뜻인지 의심 스럽지만 그게 당신의 대답이 의미하는 바입니다.
Loduwijk

try 블록에 return 문이 있으면 finally 블록이 실행됩니까?
Rahul Yadav

@Rahul 네, 드디어 호출됩니다. 참조 : stackoverflow.com/questions/65035/…
roottraveller

1
@Aaron-try-with-resource에 대한 새로운 구문으로 try 키워드 바로 뒤에 괄호 안에 구성된 모든 항목에 대해 .close ()를 자동으로 호출합니다.
Roboprog

2

예외 또는 throwable이 발생하면 try 블록이 어떻게 작동합니까?

예외는 잡히지 않은 다른 경우와 마찬가지로 블록 밖으로 던져집니다.

finally 블록은 try 블록이 종료되는 방법에 관계없이 실행됩니다. 일치하는 catch가 있는지 여부에 관계없이 catch가 전혀 있는지 여부에 관계없이 실행됩니다.

catch 블록과 finally는 try 블록의 직교 부분입니다. 둘 중 하나 또는 둘 다를 가질 수 있습니다. Java 7을 사용하면 둘 다 가질 수 없습니다!


1

그 프로그램으로 시도하지 않습니까? finally 블록으로 이동하여 finally 블록을 실행하지만 예외는 처리되지 않습니다. 그러나 그 예외는 finally 블록에서 무시할 수 있습니다!


1

finally 블록은 try 블록이 완료된 후 실행됩니다. try 블록을 떠날 때 무언가가 던져지면 finally 블록이 실행됩니다.


0

try블록 안에 예외를 던질 수있는 코드를 작성합니다. catch우리가 예외를 처리 곳 블록이다. finally블록에 관계없이 항상 예외가 발생 여부 실행되지 않습니다.

이제 try-catch-finally 블록 대신 try-finally 블록이있는 경우 예외가 처리되지 않고 제어 대신 try 블록이 catch 블록 이후에 finally 블록으로 이동합니다. 예외로 아무것도하지 않으려면 try-finally 블록을 사용할 수 있습니다.


0

에 관계없이 예외의 발생 여부에 try블록 - finally블록이 실행됩니다. 예외는 포착되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.