0

我的 Lucene 代码中有一行:

try
{
    searcher.GetIndexReader();
}
catch(Exception ex)
{
    throw ex;
}
finally
{
    if (searcher != null)
    {
        searcher.Close();
    }
}

在我的 finally 子句中,当我执行 searcher.Close() 时,它是否也会在幕后执行 searcher.GetIndexReader().Close?

还是我需要显式调用 searcher.GetIndexReader().Close() 方法来关闭 IndexReader?

谢谢阅读。

4

2 回答 2

2

抱歉,很难理解您的代码段中的搜索器类型是什么以及它是如何构建的。但是您不应该使用searcher.GetIndexReader().Close() 关闭索引阅读器。searcher.Close()将关闭与其关联的所有资源和索引阅读器,如果searcher 不是使用IndexSearcher(IndexReader r)构造的 IndexSearcher 实例。在这种情况下,您必须手动关闭索引阅读器。

于 2009-05-11T02:08:40.113 回答
1

首先,这样的代码总是一个坏主意:

try {
    // Do something
} catch(Exception ex) {
    throw ex;  // WRONG
}

您只是掩盖了异常的来源,并且仍在抛出。最好只是删除这些行。

如果您没有创建IndexReader自己,则不需要自己关闭它。您根本不需要使用该方法getIndexReader的可能性很高。

此外,除非您在块searcher内分配,否则try无需检查它是否为空,因为它不可能获得空值。

这是您的代码应如下所示的示例:

String myIndexDir = "/my/index/dir";

IndexSearcher searcher = new IndexSearcher(myIndexDir);
try { 
    // Do something with the searcher
} finally { 
    searcher.close(); 
}
于 2009-05-11T08:38:33.830 回答