> Java > java지도 시간 > Java의 finally 블록

Java의 finally 블록

Mary-Kate Olsen
풀어 주다: 2024-11-13 02:10:02
원래의
642명이 탐색했습니다.

El bloque finally en Java

Java에서 예외를 처리할 때 코드의 이 부분을 호출하는 사람에게 처리를 위임하는 것이 아니라 try-catch 블록을 사용하여 예외를 처리해야 하는 경우가 많습니다. . 그러나 때로는 예외가 발생했는지 여부, 프로그램 실행 흐름이 성공적으로 완료되었는지 여부(예: 파일 닫기, 데이터베이스 연결 등)에 관계없이 특정 작업을 수행해야 하는 경우가 있습니다.

이러한 경우 finally 블록이 사용됩니다. 이 블록은 catch 블록 뒤에 배치되며, catch 블록을 사용하지 않는 경우 try 블록 뒤에도 배치됩니다. finally 블록 내부에 있는 코드는 두 가지 시나리오에서 실행됩니다.

  • try 블록이 종료되고 예외가 발생하지 않은 경우
  • 예외가 발생하면 실행 흐름이 중단되고 catch 블록이 실행됩니다.

실시예 1

두 개의 정수를 받아 둘 사이의 나눗셈 결과를 반환하는 나누기 메서드를 생각해 보겠습니다. 이는 try-catch 블록을 사용하여 0으로 나누려고 할 때 발생하는 예외를 처리할 뿐만 아니라 finally 블록을 사용하여 리소스가 정리되고 있음을 나타내는 메시지를 인쇄합니다.

public static int divide(int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
            throw e;
        } finally {
            System.out.println("Cleaning up resources...");
        }
    }
로그인 후 복사
로그인 후 복사

값 10과 2로 나누기 메소드를 호출하면 다음과 같은 출력이 얻어집니다.

Cleaning up resources...
5
로그인 후 복사
로그인 후 복사

보시다시피 예외가 발생하지 않았으므로 메서드는 나누기 결과를 반환하고 finally 블록의 출력이 먼저 표시되지만 finally 블록이 실행되었습니다. 반면에 10과 0의 값으로 나누기 메소드를 호출하면 다음과 같은 출력이 얻어집니다.

Error: / by zero
Cleaning up resources...
Exception in thread "main" java.lang.ArithmeticException: / by zero ...
로그인 후 복사

이 경우 예외가 발생하여 실행 흐름이 중단되고 catch 블록이 실행되었지만 다시 예외가 발생하기 전에 finally 블록이 실행되었습니다. 두 예제 모두에서 얻은 결과에 관계없이 finally 블록이 항상 실행되는 것을 확인했습니다.

실시예 2

finally 블록의 주요 용도는 파일 닫기, 데이터베이스 연결 또는 네트워크 연결 닫기 등 try 블록에서 사용된 리소스를 해제하는 것입니다. 이를 예시하기 위해 파일의 내용을 읽고 첫 번째 줄을 반환하는 readFile 메서드를 고려해 보겠습니다. 이는 try-catch 블록을 사용하여 파일을 읽을 수 없는 경우 발생하는 예외를 처리하고 finally 블록을 사용하여 파일을 닫습니다.

public static String readFile() throws IOException {
    FileReader reader = null;
    try {
        reader = new FileReader("file.txt");
        BufferedReader buffer = new BufferedReader(reader);
        return buffer.readLine();
    } catch (IOException e) {
        System.out.println("Error: " + e.getMessage());
        throw new RuntimeException(e);
    } finally {
        if (reader != null) reader.close();
    }
}
로그인 후 복사

readFile 메소드가 실행되고 파일을 읽을 수 없는 경우 다음 출력을 얻습니다.

public static int divide(int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
            throw e;
        } finally {
            System.out.println("Cleaning up resources...");
        }
    }
로그인 후 복사
로그인 후 복사

보시다시피 예외가 발생하여 실행 흐름이 중단되고 catch 블록이 실행되었지만 다시 예외가 발생하기 전에 finally 블록이 실행되어 파일을 닫았습니다. 반면에 Hello world!라는 콘텐츠로 file.txt 파일이 생성되면! readFile 메소드가 호출되면 예외 없이 다음 출력이 얻어집니다.

Cleaning up resources...
5
로그인 후 복사
로그인 후 복사

이 예에서 고려해야 할 몇 가지 측면은 다음과 같습니다.

  • reader 변수는 finally 블록에서 접근할 수 있도록 try 블록 외부에 선언되었습니다. 즉, 두 블록의 범위 내에 있습니다.
  • 파일을 닫으려고 하기 전에 리더 변수가 null과 다른지 확인했습니다. 파일을 열 수 없는 경우 이 변수는 null로 유지되고 닫으려고 할 때 예외가 발생하기 때문입니다.
  • finally 블록 내에서 파일을 닫으려고 할 때 close 메소드에서 발생할 수 있는 예외는 처리되지 않고 메소드 시그니처에 전파됩니다. 이를 처리하려는 경우 try-catch로 래핑할 수 있습니다. finally 블록 내부의 블록입니다.

결론

Java 내에서 finally 사용이 너무 흔해져서 언어 자체에 리소스 관리를 단순화할 수 있는 대안인 try-with-resources 블록이 있습니다. 이 블록은 사용이 끝나면 자동으로 리소스를 닫는 역할을 담당하므로 리소스를 해제하기 위해 finally 블록을 사용할 필요는 없습니다. 그러나 특정 경우에는 finally 블록이 여전히 유용하며 두 옵션을 함께 사용할 수 있다는 점에 유의하는 것이 중요합니다.

위 내용은 Java의 finally 블록의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿