이 질문은 Exception in finalize method 및 이와 유사한 질문과 반대입니다.finalize 메서드에서 사용자가 볼 수있는 예외를 트리거
제대로 닫히지 않으면 심각한 위험을 초래하는 AutoCloseable
클래스를 생성 중입니다. 나는 그런 경우에 실패하기를 바라고있어 사용자가 우연히 그렇게하는 것을 잊지 않도록한다.
Closeable
일반 우수 사례가 정상적으로 작동하지 않아 발신자의 오류를 완화하기 위해 최선을 다하고 있지만이 경우 발신자가이 기능을 놓치지 않을 것임을 알고 있습니다. 아이디어에 개념적으로 동의하지 않는다면, 귀하의 의견에 감사 드리며,이 경우 자바 내부에 대한 학문적 인 질문을 생각해보십시오.
내가 상상 한 것은 IllegalStateException
을 발생시키고 클래스의 finalize()
메서드가 호출되고 인스턴스가 아직 정리되지 않은 경우 사용자를 방해하는 것입니다. 그러나 finalize()
은 명시 적으로 포착되지 않은 예외를 삼켜 버리기 때문에 까다로울 수 있습니다. 사용자가 finalize()
방법에서 볼 수있는 RuntimeException
을 발생시키는 가장 좋은 방법은 무엇입니까? 내가 그 finalize()
실행이 보장되지도 실현, 그래서이 방법을 주위에 구현하는 것을 절대적으로 일어나지 않을 것입니다 :
public class SeriouslyCloseable implements AutoCloseable {
// We construct an Exception when the class is initialized, so that the stack
// trace informs where the class was created, rather than where it is finalized
private final IllegalStateException leftUnclosed = new IllegalStateException(
"SEVERE: "+getClass().getName()+" was not properly closed after use");
private boolean safelyClosed = false;
@Override
public void close() {
// do work
safelyClosed = true;
}
@Override
protected void finalize() throws IllegalStateException {
if(!safelyClosed) {
// This is suppressed by the GC
throw leftUnclosed;
}
}
}
참고 : 여기에
는 내가 지금까지 뭘 찾았는지의 데모 클래스의 . 나는 GC가 우리에게 기회를 준다면 여전히 으로, 아마도이 일어나기를 원할 것이다.