這個問題觸發一用戶可見的例外是Exception in finalize method和類似的問題相反。在Finalize方法
我創建一個AutoCloseable
類構成了嚴重的風險,如果沒有正確關閉。在這種情況下,我正在尋求失敗 - 以便用戶不會意外地忘記這麼做。
我意識到並同意,一般最佳做法是讓Closeable
優雅地失敗並盡其所能緩解來電者的錯誤,但在這種情況下,來電者不會想錯過此操作。如果你在概念上不同意這個想法,我會很感激你的反饋,但在這種情況下,考慮一個關於Java內部的學術練習的問題。
我想如果我調用IllegalStateException
並打斷用戶,如果我的類的finalize()
方法被調用,並且實例還沒有被清理。但finalize()
顯式吞下未捕獲的異常,這使得這個棘手。導致用戶從finalize()
方法中看到的RuntimeException
的最佳方法是什麼?
這裏有一個演示類的東西,我這麼遠:
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;
}
}
}
注:我知道也是finalize()
不能保證運行,所以任何事情我身邊這個方法實施並非絕對不會發生。我仍然喜歡,如果GC給我們機會,可能會發生。