2017-04-16 1 views
0

Java Docs의 다음 코드를 고려하십시오. 자바 문서 당으로try 블록 및 try-with-resources 문에서 예외가 발생했습니다.

static String readFirstLineFromFile(String path) throws IOException { 
    try (**BufferedReader br = new BufferedReader(new FileReader(path))**) { 
     **return br.readLine();** 
    } 
} 

, 예외 try 블록과 시도 -과 - 자원 문에서 모두 발생하는 경우 readFirstLineFromFile은 다음 방법 readFirstLineFromFile가 발생 예에서

try 블록에서 예외가 발생했습니다. try-with-resources 블록에서 throw 된 예외는 이 표시되지 않습니다. 을, BufferedReader 인스턴스가 시도 -과 - 자원 문에 선언되어 있기 때문에 다른 한편으로

, 그것은 또한

언급, 그것은 관계없이 try 문 가 정상적으로 완료 여부에 종료됩니다 또는 갑자기 (메서드의 결과로서
IOException를 슬로우하는 BufferedReader.readLine). 가정

그래서 (try 블록이 실행 된 후에 만 ​​close 메소드가 내 이해에 따라 ...라는 것을 의미)

, 모두 문 - 자원과-시도하고 블록을 던져 예외를 시도 상기 예외

1) 예외는 제 try 블록으로부터 발생되고 발생 된 순서를 고려 return br.readLine();

2) try 블록이 완료 되 자마자 try 블록에서 예외가 throw되는지 여부에 관계없이 Buffered Reader의 close 메서드가 호출되고 exception도 throw됩니다.

따라서, 이상적 방법 readFirstLineFromFile에서 던진 예외가 아니라 (Javadoc과 내부에 언급 된 내용에 비해) try 블록 내부 return br.readLine();에서 하나보다 (이 마지막으로 실행 된 이후)의 BufferedReader의 close 메소드에서 하나 여야합니다

누군가 내 의심을 분명히 할 수 있습니까?

+0

이것이 이상적이라고 생각하지 않습니다. close() 메서드에 의해 throw 된 기술적 예외 대신 try 블록에 의해 throw 된 기능적 예외를 얻는 것을 선호합니다. 예를 들어 파일이 삭제 되었기 때문에 예외가 IOException 인 경우 독자가 파일을 읽을 수 없다는 예외가 아니라 파일에서 읽을 수 없다는 예외를 선호합니다. 또한 파일 삭제로 인해 발생합니다). –

답변

0

try(<<stuff>>){stuff.dude();}try{stuff.dude();}finally{stuff.close();}입니다.

성공하거나 실패 할 경우 적용 가능한 경우 닫을 수 있습니다.

관련 문제