code

catch 후 코드 대신 finally를 사용하는 이유

codestyles 2020. 10. 19. 08:05
반응형

catch 후 코드 대신 finally를 사용하는 이유


이 질문에 이미 답변이 있습니다.

왜 이렇게

} catch (SQLException sqle) {
    sqle.printStackTrace();
} finally {
    cs.close();
    rs.close();
}

이 대신

} catch (SQLException sqle) {
    sqle.printStackTrace();
}
rs.close();
cs.close();

예외가 발생 하면 예외가 잡히지 않는 한 블록 이 실행 된 후 코드try 가 발생 하지 않기 때문 입니다. 블록은 항상 내부에 무슨 상관없이 실행되는 블록을.finallytry


캐치 블록을보세요 DAOException. 던질 것 입니다. 따라서 catch 블록 뒤의 문 은 제공된 샘플에서도 실행되지 않습니다 . 여러분이 보여 주었던 것 (한 예외를 다른 예외로 감싸는 것)은 하나의 일반적인 패턴입니다. 그러나 또 다른 가능성은 catch 블록이 "우연히"예외를 던지는 것입니다. 예를 들어 호출 중 하나가 실패했기 때문입니다.

또한 메서드가 예외를 throw한다고 선언했거나 확인되지 않은 예외이기 때문에 포착 하지 못한 다른 예외가있을 수 있습니다 . IllegalArgumentException어딘가에 던져 졌기 때문에 정말로 리소스를 유출하고 싶 습니까?


예외가 발생하면

  • finally 절의 코드는 예외가 나머지 메서드 실행을 중단하더라도 예외가 바깥쪽으로 전파 될 때 실행됩니다.

  • try / catch 블록 이후의 코드는 예외가 catch 블록에 의해 포착되고 다시 발생하지 않는 한 실행되지 않습니다.


finally 블록의 항목이 실행되도록 보장하기 때문입니다. 예를 들어 catch 블록에 또 다른 예외가있는 경우와 같이 catch 이후 항목이 실행되지 않을 수 있습니다. 또는 당신이 한 일을하고 원래 예외를 래핑하는 예외를 던집니다.


HeadFirst Java에 따르면 try 또는 catch 블록에 return 문이 있어도 finally 블록이 실행됩니다. 흐름은 마지막으로 점프했다가 다시 돌아옵니다.


finally 키워드는 코드 실행을 보장합니다. 아래 예제에서 close 문은 실행되지 않습니다. 맨 위 예제에서는 실행됩니다 (원하는대로!)


두 번째 접근 방식은 이미 메서드가 남아 있기 때문에 'close'문을 수행하지 않습니다.


모든 오류를 포착하면 차이가 없어야합니다. 그렇지 않으면 코드 실행 순서가 다음과 같기 때문에 finally 블록 내부의 코드 만 실행됩니다. finally 코드-> 오류 발생-> catch 후 코드, 코드에서 처리되지 않은 오류가 발생하면 마지막으로 만 실행됩니다. 코드 블록이 예상대로 작동합니다.


이것이 리소스 누출을 피하는 방법입니다.


finally 블록의 코드는 catch 블록에서 예외가 다시 발생하기 전에 호출됩니다. 그러면 finally 블록에 넣은 정리 코드가 호출됩니다. finally 블록 외부의 코드는 실행되지 않습니다.


이것은 명확히 할 수 있습니다 : http://www.java2s.com/Code/Java/Language-Basics/Finallyisalwaysexecuted.htm


catch가 호출 스택의 상위 수준 함수에 예외를 던질 수 있다는 점을 고려하십시오. 이것은 예외를 상위 수준으로 던지기 전에 final 호출을 유도합니다.


에서 http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html 이 잘못된 것입니다 (그리고 질문에 유래했을 수) :

The try block of the writeList method that you've been working with here opens a PrintWriter. The program should close that stream before exiting the writeList method. This poses a somewhat complicated problem because writeList's try block can exit in one of three ways.

1. The new FileWriter statement fails and throws an IOException.
2. The list.get(i) statement fails and throws an IndexOutOfBoundsException.
3. Everything succeeds and the try block exits normally.

4 방법 (이외의 다른 예외 IOExceptionIndexOutOfBoundsException발생합니다)가 없습니다. 이전 페이지에 설명 된 코드는를 사용하기 전에 (1) 및 (2) 만 포착합니다 finally.

나는 또한 자바를 처음 접했고이 기사를 찾기 전에 같은 질문을했다. 잠복 기억은 일반적으로 이론보다는 예에 더 많이 집착하는 경향이 있습니다.


finally 블록은 항상 실행되지 않을 수 있으므로 다음 코드를 고려하십시오.

public class Tester {
    public static void main(String[] args) {
        try {
            System.out.println("The main method has run");
            System.exit(1);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("The finally block has run");
        }
    }
}

귀하의 경우에는 finally 블록 내부의 코드를 try / catch로 래핑하는 것이 좋습니다.이 코드는 분명히 예외를 throw 할 수 있기 때문입니다.

    } catch (SQLException sqle) {
        sqle.printStackTrace();
    } finally {
     try {
        cs.close();
        rs.close();
     } catch (Exception e) {
      //handle new exception here
    }

참고 URL : https://stackoverflow.com/questions/4691962/why-use-finally-instead-of-code-after-catch

반응형