2012-06-08 3 views
2

간단한 파일 읽기 및 쓰기 기능이 있습니다.BufferedReader에서 close() 예외를 catch해야하지만 PrintWriter에서 catch하지 않아야하는 이유는 무엇입니까?

private void WriteToFile(String filename, String val) { 
    PrintWriter outStream = null; 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(filename); 
     outStream = new PrintWriter(new OutputStreamWriter(fos)); 
     outStream.print(val); 
     outStream.close(); 
    } catch (Exception e) { 
     if (outStream != null) { 
      outStream.close(); 
     } 
    } 
} 

private String ReadFile(String filename) { 
    String output = ""; 
    FileReader fr = null; 
    BufferedReader br = null; 
    try { 
     fr = new FileReader(filename); 
     br = new BufferedReader(fr); 
     output = br.readLine(); 
     br.close(); 
    } catch (Exception e) { 
     if (br != null) { 
      br.close(); 
     } 
    } 

    return output; 
} 

언제 얻을 건물 :

unreported exception java.io.IOException; must be caught or declared to be thrown 
      br.close(); 
        ^

이유는 br.close을 잡을 필요합니까하지만 WriteToFile의 가까이에 대해 불평하지 않습니다()?

+0

에()'이동'br.close을 시도해보세요'고대'PrintWriter' 설계되어 단지 방법은 그 –

+0

을 차단 finally'. 그 메소드 중 어느 것도'IOException'을 던지지 않습니다. 대신에'FileWriter'를 사용하십시오. – BalusC

+0

나는 읽기에 더 염려합니다. close 메소드가 예외를 throw하지 않는 '동등한'독자가 있습니까? – Grazfather

답변

8

:

public void close() throws IOException { 
    synchronized (lock) { 
     if (in == null) 
      return; 
     in.close(); 
     in = null; 
     cb = null; 
    } 
} 

BufferedReader가 IOException을 발생시킵니다.

귀하의 질문에 답변 해주십시오.

+0

의미가 있습니다. 나는 finally 블록에 또 다른 try-catch를 넣었지만, 그것은 복잡한 것처럼 보인다. BufferedReader와 비슷한 기능이있어 닫힌 함수가 자체 예외를 잡아낼 수 있습니까? – Grazfather

+1

java.util.Scanner가 답변입니다. –

+0

+1 질문에 실제로 대답하는 경우 +1. – Charles

2

PrinterWriter.close() 예외를 발생시키지 않습니다. fos.close()으로 전화하면 예외를 포착/던져달라고 요청합니다.

5

왜 내가 br.close를 잡아야하지만 WriteToFile의 close()에 대해 불평하지 않는가?

Java Docs에서이를 확인할 수 있습니다. PrintWriter에 대한

public void close() 
      throws IOException 

그리고 close() 방법 : BufferedReaderclose() 방법은

public void close() 

에 같은 대답의 질문은 JVM은 불평하지 않는 이유입니다. 그것은 방법 서명에서 명확하기 때문에; IOException이는 java.io.BufferedReader의의 소스 코드에서의 PrintWriter

의 close() 메소드 내에 먹었다

public void close() { 
    try { 
     synchronized (lock) { 
      if (out == null) 
       return; 
      out.close(); 
      out = null; 
     } 
    } 
    catch (IOException x) { 
     trouble = true; 
    } 
} 

:를 java.io.PrintWriter의 소스 코드에서 촬영

1

PrintWriter.java. 예외가 발견되어 처리됩니다. 그래서 당신은 그것을 사용하는 동안 그것을 잡을 필요가 없습니다.

자바 출처 :

public void close() { 
     try { 
      synchronized (lock) { 
       if (out == null) 
        return; 
       out.close(); 
       out = null; 
      } 
     } 
     catch (IOException x) { 
      trouble = true; 
     } 
    } 

그러나 BufferedReader로에서 예외가 발생

. 따라서 사용할 때 그것을 잡아야합니다.

자바 소스 :

public void close() throws IOException { 
      synchronized (lock) { 
       if (in == null) 
        return; 
       in.close(); 
       in = null; 
       cb = null; 
      } 
     } 
+1

그건 이유가 아니야. 그 이유는 메서드가 IException을 throw하도록 선언되어 있지 않기 때문입니다. – EJP

관련 문제