강의로 돌아가기
-

예제 관련한 질문입니다.

fis와 fos를 해제시킬 때 close메소드를 사용하는데요.

try 문 내의 while이 전부 실행된 이후에 바로 close를 해주면 되지 않나요?

어차피 close도 exception이 가능하기 때문에 한번에 하지 않고 finally를 만들어서 다시 try-catch 문을 사용하는지 궁금합니다.

작성중인 코드―ByteReadWriteExam.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.*;

public class ByteReadWriteExam{
  public static void main(String[] args){
    FileInputStream fis = null;
    FileOutputStream fos = null;
    try{
      fis = new FileInputStream("data.txt");
      fos = new FileOutputStream("copy.txt");
      //data.txt의 파일을 읽어서 그대로 copy.txt에 복사하려고 합니다.
      //이 아래에서 fis와 fos를 이용해서 파일 복사를 완성해 보세요.


    }
    catch(Exception e){
      System.out.println(e);
    } 
    finally{
        //fis와 fos를 사용하고 나면 close해야 합니다.    
        try{
          fis.close();
          fos.close();
        }
        catch(Exception e){
          System.out.println(e);
        }
    }
  }
}
1 개의 답변
Demi

try-catch-finally에서 finally는 에러가 발생했건 발생하지 않았건 실행해야 할 코드를 담아야합니다. 예시를 들어, 왜 finally에 파일을 닫는 코드를 적었는지 설명하겠습니다. 문제가 있어서 data.txt를 여는데 성공했지만, copy.txt를 여는데 실패했을 경우를 생각해보세요.

적어주신대로 파일을 열고 닫는 부분을 한 try-catch에서 처리할 경우, fos = new FileOutputStream("copy.txt");에서 에러가 발생해 이 뒤의 코드는 무시되고 catch문이 바로 실행됩니다. 이 경우 fis를 close할 방법이 없습니다.

반면 문제에 나와있는 대로 파일을 닫는 코드를 finally에 적을 경우, 에러가 발생 한후 finally 블록이 무조건 실행되기 때문에 fis는 닫힐 수 있습니다.

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.