[java] Java Try Catch finally 블록은 Catch없이

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



답변

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

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


답변

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

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

답변

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 실행


답변

내부 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


답변

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) ...


답변

버전 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 ()를 호출하거나 프로세스를 중단시키는 치명적인 오류를 유발하여) 실행되지 않습니다.

답변

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

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

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

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