Java 예외

Resource 와 finally

수업소개

파일, 데이터베이스와 같은 자원들은 작업이 끝났을 때 연결을 끊어줘야 합니다. 이러한 작업들에 대해서 알아봅니다. 이렇게 반드시 해야 할 작업들을 처리해야 할 때 finally를 이용합니다. finally에 대해서도 살펴보겠습니다.

 

 

 

강의

 

 

 

소스코드

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

import java.io.FileWriter;
import java.io.IOException;

public class CheckedExceptionApp {
    public static void main(String[] args) {
        FileWriter f = null;
        try {
            f = new FileWriter("data.txt");
            f.write("Hello");
        } catch(IOException e){
            e.printStackTrace();
        } finally {
            // 만약에 f가 null이 아니라면
            if(f  != null) {
                try {
                    f.close();
                } catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

 

댓글

댓글 본문
  1. jajada
    프로그램이 외부(파일, 네트워크, 데이터베이스)에 접근한 이후에는 접근했던 그 파일, 네트워크, 데이터베이스 와의 연결을 끊어줘야 한다. 그때 사용하는 것은 close()라는 메서드이다.

    하지만 그것을 try안에 쓰게 되면 문제가 발생하는데 try안에서 close()에 도착하기 전, 어떤 코드에서 예외가 터져버려면 그대로 catch로 이동해 catch안에 있는 코드를 실행하고 코드를 빠져나가 close()를 실행하지 않는문제가 발생한다.

    이때 사용하는 것이 finally이다.

    finally는 try의 예외 상황에 상관 없이 무조건적으로 실행되는 부분이기 때문에 그곳에다가 close()를 적어두면 예외가 터지는 여부와 상관없이 확실히 close()를 사용할 수 있다.

    다음과 같은 코드를 작성했을때
    FileWriter f = null;
    try {
    f = new FileWriter("data.txt");
    f.write("Hello");
    } catch (IOException e) {
    e.printStackTrace();
    } finally{
    f.close();
    }

    fianlly 안에 있는 f.close()에서 close()부분에 빨간 줄이 생기게 된다.
    그 이유는 close()도 결국 Input Ouput 과 같은 작없이기 때문에 여기서도 IOEception이 발생하게 된다

    그래서 f.close()부분에도 try를 씌워줘야 한다.
    FileWriter f = null;
    try {
    f = new FileWriter("data.txt");
    f.write("Hello");
    } catch (IOException e) {
    e.printStackTrace();
    } finally{
    if(f != null) {
    try {
    f.close();
    } catch (IOException e) {
    System.out.println("자바야 알아서 좀 하자");
    }
    }
    }

    이렇게 만들게 되면 close()를 문제없이 사용할 수 있게 된다.
  2. 당당
    2023.04.18
  3. Min Jupiter
    2023.01.16
  4. 코딩이취미다
    딱 이렇게 까지 해야 하나,
    깊은 빡 침 중에....딱 해결책을....
  5. 나연
    2022년 2월 26일 (토) 완료

    자바가 프로그램 외부에 있는 데이터에 접근하려고 할 때 생길 수 있는 문제들
    - 리소스(resource) : 자바 내부에 존재하는 데이터 X
    -- 대표적인 외부에 있는 데이터 : 이미지 또는 사운드 파일
    -- 네트워크에 접속해서 데이터 사용
    -- 데이터베이스 : 네트워크 사용
    - 리소스를 붙잡고 있는 행위를 하고 있다가 작업이 다 끝나면 붙잡고 있었던 것을 놔줘야 함
    -- 그때 공통적으로 사용하는 메소드 : `close()`

    ```java
    // Variable might not have been initialized 오류 때문에 null로 초기화
    FileWriter fileWriter = null;
    try {
    // fileWriter는 try의 중괄호 안에서 선언되었기 때문에 중괄호 안에서만 접근 가능 : "유효 범위"
    //
    fileWriter = new FileWriter("data.txt");
    fileWriter.write("Hello");
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    // try 안에서 익셉션이 발생했건 안 했건 무조건 finally 실행
    // close()를 하기 전에 예외가 발생할 수 있기 때문에 finally로 처리

    // IOException이 close()할 때도 발생 가능
    if (fileWriter != null) {
    try {
    fileWriter.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    ```
  6. 2021.09.01 완료
  7. boat
    감사합니다!!
  8. oyuiw
    20201214
graphittie 자세히 보기