文档中的多个fieldables会导致nullpointerexception

时间:2011-07-07 11:36:58

标签: java lucene indexing

当我向我的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;
            }                   
        };

1 个答案:

答案 0 :(得分:1)

您正在从头开始实施Fieldables。我怀疑问题隐藏在被删除的行中 - 也许其中一个实现的方法返回null,它应返回一个实际值。

  1. 尝试添加Field的实例,并检查是否仍有相同的错误
  2. 使用调试器在NullPointerException上添加一个断点,这有助于找到问题的真正的原因。

  3. 现在您已经添加了Fieldable的实现,我非常确定NPE会发生,因为您在实现中返回了一些null值。

    热门候选人是readerValue()的实施,返回null。 JavaDoc解释说,此方法返回的Reader可以在索引时使用,以生成索引令牌。当您向文档添加多个Fieldable时,索引会自动发生。

    尝试一下:

    @Override
    public Reader readerValue() {
         return new StringReader(path);
    }
    

    更改您的实施并避免返回null,除非JavaDoc明确指出,null是合法的返回值。

    (并且:即使Field已被弃用:如果问题与您的Fieldables相关,请使用它进行测试。如果您的代码与Field个对象一起使用,那么你知道在哪里看)