programing

캐치 후 코드 대신 최종적으로 사용하는 이유

goodjava 2023. 1. 14. 09:30

캐치 후 코드 대신 최종적으로 사용하는 이유

왜 이러는 거야?

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

이것 대신에

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

왜냐하면 예외가 검출되지 않는 한 블록 실행예외가 느려진 경우 코드가 표시되지 않기 때문입니다.afinally에서 무슨 항상 실행됩니다.try

던질 예요.DAOException따라서 catch block 뒤의 문장은 당신이 준 샘플에서도 실행되지 않습니다.여기서 보여 준 것은 (한 예외를 다른 패턴으로 래핑하는) 하나의 일반적인 패턴입니다.또 다른 가능성은 캐치 블록이 발신하는 콜 중 하나가 실패하기 때문에 "우발적으로" 예외를 발생시킬 수 있습니다.

또한 메서드에 의해 예외가 발생한다고 선언했거나 선택되지 않은 예외가 발견되지 않을 수 있습니다.정말로 자원을 유출하고 싶습니까?IllegalArgumentException디론론? 츠요시

왜냐하면 만약 예외가 던져진다면

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

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

HeadFirst Java에 따르면 try 또는 catch block이 return 문을 가지고 있더라도 최종적으로 블록이 실행됩니다.흐름은 마지막으로 점프했다가 다시 되돌아갑니다.

최종 블록에 있는 것이 확실하게 실행되도록 하기 때문입니다.예를 들어 캐치 블록에 다른 예외가 있는 등 캐치 후 처리가 실행되지 않을 수 있습니다.또는 원래 예외를 감싸는 예외를 발생시킬 수도 있습니다.

finally 키워드는 코드가 실행됨을 보증합니다.아래 예에서는 close 문은 실행되지 않습니다.위의 예에서는 (필요한 것)이 실행됩니다.

두 번째 접근법에서는 이미 메서드가 남아 있기 때문에 'close' 문장은 사용할 수 없습니다.

이것이 자원 누수를 방지하는 방법입니다.

에러를 모두 검출했을 경우, 차이는 없습니다.그렇지 않으면 코드 실행 시퀀스가 code -> error throw -> code, catch 후 code이기 때문에 최종적으로 블록 내의 코드만 실행됩니다.

예외가 캐치 블록에서 다시 발생하기 전에 최종 블록의 코드가 호출됩니다.이렇게 하면 최종 블록에 입력한 정리 코드가 호출됩니다.최종 블록 이외의 코드는 실행되지 않습니다.

http://www.java2s.com/Code/Java/Language-Basics/Finallyisalwaysexecuted.htm 를 참조해 주세요.

이 캐치가 콜 스택의 상위 레벨 함수에 예외를 발생시킬 수 있습니다.그러면 상위 레벨에 예외를 던지기 전에 최종 호출이 이루어집니다.

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.

네 번째 방법(예외)IOException그리고.IndexOutOfBoundsExceptionsrown)이 없습니다.앞 페이지에 표시된 코드는 다음을 수행하기 전에 (1)과 (2)만 포착합니다.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");
        }
    }
}

당신의 경우, 이 코드는 예외를 일으킬 수 있기 때문에 최종적으로 try/catch로 코드를 포장하는 것이 좋습니다.

    } 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