我的Lucene代码中有一行:
try
{
searcher.GetIndexReader();
}
catch(Exception ex)
{
throw ex;
}
finally
{
if (searcher != null)
{
searcher.Close();
}
}
在我的finally子句中,当我执行searcher.Close()时,它还会执行searcher.GetIndexReader()。在幕后关闭吗?
或者我是否需要显式调用searcher.GetIndexReader()。Close()方法来关闭IndexReader ??
感谢阅读。
答案 0 :(得分:2)
很抱歉,您很难理解代码段中搜索者的类型以及构建方式。但是你不应该用 searcher.GetIndexReader()关闭索引阅读器。关闭()。 searcher.Close()将关闭与其关联的所有资源和索引阅读器 IF搜索器不是使用 IndexSearcher(IndexReader r)构建的IndexSearcher实例。在这种情况下,您必须手动关闭索引阅读器。
答案 1 :(得分: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();
}