MyOpenedFile이 열려있는 스트림으로 파일을 래핑하는 것이라고 상상해보십시오. 질문에 대한Java 객체에 파괴가 발생하는 명확한 방법이 있습니까?
// method in an Util class
static void safeClose(MyOpenedFile f) {
if (f != null) {
try {
f.close();
} catch(IOException ex) { /* add logging or console output */ }
}
}
실제 방법 : 다음 코드 가정
void doSomeFileOperation(...) throws IOException, ... {
MyOpenedFile f1 = null;
MyOpenedFile f2 = null;
try {
/* method's "business logic" code beings */
f1 = new MyOpenedFile(...);
//do stuff
f2 = new MyOpenedFile(...);
// do stuff
f1.close(); f1 = null;
// do stuff with f1 closed
f2.close(); f2 = null;
// do stuff with f2 closed
/* method's "business logic" code ends */
} finally {
Util.safeClose(f1); f1 = null;
Util.safeClose(f2); f2 = null;
}
}
지금이 아주 지저분하고, 특히 오류가 발생하기 쉬운입니다 (finally 블록은 매우 어려울 수 있습니다에서 일부 코드는 장치에서 호출하세요 테스트 등). 예를 들어 C++에서 소멸자는 정리 된 포인터 소멸자 또는 직접 호출되는 정리를 처리하고 코드는 훨씬 더 깨끗합니다.
그래서, 비즈니스 로직 코드의 조각 위에 포장 더 나은/더 좋은/청소기 방법은, 그래서 거기에 예외가 전파 얻을하지만 두 파일 f1
및 f2
심지어 경우, 닫히지 (또는 적어도 가까이하는 것은 모두 시도된다 실패)?
좋은 래퍼를 제공하는 Apache Commons와 같은 오픈 소스 라이브러리를 가리키는 답변도 환영합니다.
BTW, 코드 샘플은 실제로 당신이 당신이 그것을 닫기 전에 널 (null) = F1 설정 때문에 파일 핸들 누출의 원인이됩니다 거기에 실수가있다. – Chii
@Chii 아니, 내가 볼 수있는 한. 모든 'null'할당 전에'close' 또는'safeClose' *가 있습니다. – hyde
왜 파일 당'close'를 두 번 호출합니까? (try와 finally에서)? – home