2012-01-24 4 views
7
try { 
    FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} finally { 
    fr.close(); 
} 

fr.close()이 오류가 표시되지 않습니다닫기 파일

fr cannot be resolved

나는 finally 블록에서 파일을 닫는 것이 좋습니다 읽었습니다.
뭐가 잘못 되었나요?

답변

17

변수 frtry 블록 내에 만 범위가 있습니다. 그것은 finally 블록에서 범위를 벗어났습니다. 당신은 전에에게 try 블록 를 선언해야합니다

FileReader fr = null; 
try { 
    fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} finally { 
    if (fr != null) { 
     try { 
      fr.close(); 
     } catch (IOException e) { 
      // This is unrecoverable. Just report it and move on 
      e.printStackTrace(); 
     } 
    } 
} 

이 코드의 매우 일반적인 패턴입니다, 그래서 미래의 유사한 상황을 기억하는 것이 좋다.

하는이 방법에서 IOException을 던지는 고려 - 인쇄 트랙 흔적은 중첩 된 시도 캐치를 필요로하지 않을 발신자 에 매우 도움이되지 않습니다 주위 fr.close()

+0

내가 그렇게하면 파일을 닫는 동안 다른 Try 블록을 추가해야한다고 나와 있습니다. 나는 그것에 대해 할 수있는 일이 없다는 이전 게시물을 읽었습니다. 그래서, 이것이 가장 좋은 방법일까요? – noMAD

+0

예, 귀찮습니다. 종종 "closeQuietly"(또는 유사)라는 유틸리티 메소드를 작성하여이를 수행합니다. 예외를 무시하고 무시합니다. – user949300

+0

중첩 된'try/catch'에 대한 편집 된 답변보기 - 일반적인 패턴 – Bohemian

5

이제 마지막 블록이 필요하지 않습니다,

try (FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr);){ 

    String line = null; 

    } 

} catch(FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} 

이제 독자가 자동으로 닫힙니다.

+2

예, Java 7에서만 가능합니다. Java 6 이전에서는이 기능이 없습니다. – user949300

+0

예, 그렇습니다. – Kushan

+0

누군가가 왜 이런지 궁금해 할 때 "자원을 시험해보십시오" – axxis

0

범위에 문제가 있습니다. 구문을 실제로 사용하려면 다음과 같이 수정해야합니다.

FileReader fr = null; 
try { 
    fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} finally { 
    if(fr != null) 
     fr.close(); 
} 

이렇게하면 fr이 마지막 블록 범위에 존재합니다.