当我向我的Document添加多个Fieldable时,当我尝试将文档添加到indexwriter时,我得到一个nullpointer异常(没有任何异常描述)。
我只更改了名为stringvalue的可现场方法,以返回一个字符串。
是否不允许添加更多的场地,或者我错过了什么?
可能相关的代码
File[] files = FILES_TO_INDEX_DIRECTORY.listFiles();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_33);
SimpleFSDirectory d = new SimpleFSDirectory(INDEX_DIRECTORY);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_33, analyzer);
IndexWriter indexWriter = new IndexWriter(d, iwc);
for (File file : files) {
try
{
final String path = file.getCanonicalPath();
final String name = file.getName();
Fieldable field1 = new Fieldable()
{ removed }
Fieldable field2 = new Fieldable() {also removed}
Document document = new Document();
document.add(field1);
document.add(field2);
List<Fieldable> minliste = document.getFields();
indexWriter.addDocument(document); //this is where it fails
}
Fieldable:
Fieldable field1 = new Fieldable()
{
@Override
public int getBinaryLength() {
return 0;
}
@Override
public int getBinaryOffset() {
return 0;
}
@Override
public byte[] getBinaryValue() {
return null;
}
@Override
public byte[] getBinaryValue(byte[] arg0) {
return null;
}
@Override
public float getBoost() {
return 0;
}
@Override
public boolean getOmitNorms() {
return false;
}
@Override
public boolean getOmitTermFreqAndPositions() {
return false;
}
@Override
public boolean isBinary() {
return false;
}
@Override
public boolean isIndexed() {
return false;
}
@Override
public boolean isLazy() {
return false;
}
@Override
public boolean isStoreOffsetWithTermVector() {
return false;
}
@Override
public boolean isStorePositionWithTermVector() {
return false;
}
@Override
public boolean isStored() {
return false;
}
@Override
public boolean isTermVectorStored() {
return false;
}
@Override
public boolean isTokenized() {
return false;
}
@Override
public String name() {
//TODO
return "path";
}
@Override
public Reader readerValue() {
return null;
}
@Override
public void setBoost(float arg0) {
}
@Override
public void setOmitNorms(boolean arg0) {
}
@Override
public void setOmitTermFreqAndPositions(boolean arg0) {
}
@Override
public String stringValue() {
//TODO
return path;
}
@Override
public TokenStream tokenStreamValue() {
return null;
}
};
答案 0 :(得分:1)
您正在从头开始实施Fieldables
。我怀疑问题隐藏在被删除的行中 - 也许其中一个实现的方法返回null
,它应返回一个实际值。
Field
的实例,并检查是否仍有相同的错误NullPointerException
上添加一个断点,这有助于找到问题的真正的原因。现在您已经添加了Fieldable
的实现,我非常确定NPE会发生,因为您在实现中返回了一些null
值。
热门候选人是readerValue()
的实施,返回null
。 JavaDoc解释说,此方法返回的Reader
可以在索引时使用,以生成索引令牌。当您向文档添加多个Fieldable
时,索引会自动发生。
尝试一下:
@Override
public Reader readerValue() {
return new StringReader(path);
}
更改您的实施并避免返回null
,除非JavaDoc明确指出,null
是合法的返回值。
(并且:即使Field
已被弃用:如果问题与您的Fieldables
相关,请使用它进行测试。如果您的代码与Field
个对象一起使用,那么你知道在哪里看)