множественные поля в документе вызывают исключение nullpointerexception - PullRequest
1 голос
/ 07 июля 2011

Когда я добавляю более одного Fieldable в мой документ, я получаю исключение nullpointer (без описания какого-либо исключения), когда я пытаюсь добавить документ в indexwriter.

Я только изменил полевой метод, называемый 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 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 Ответ

1 голос
/ 07 июля 2011

Вы реализуете Fieldables с нуля. Я подозреваю, что проблема скрыта где-то в ваших удаленных строках - возможно, один из реализованных методов возвращает null, где он должен возвращать реальное значение.

  1. Попробуйте вместо этого добавить экземпляры Field и проверьте, есть ли у вас такая же ошибка
  2. Используйте отладчик и добавьте точку останова на NullPointerException, которая должна помочь найти действительную причину вашей проблемы.

Теперь, когда вы добавили реализацию своей Fieldable, я почти уверен, что NPE происходит, потому что вы возвращаете некоторые значения null в своей реализации.

Горячий кандидат - ваша реализация readerValue(), которая возвращает null. JavaDoc объясняет, что Reader, который возвращается этим методом, может использоваться во время индекса для генерации токенов индекса. индексирование - это то, что происходит автоматически, когда вы добавляете более одного Fieldable к документу.

Попробуйте:

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

Измените вашу реализацию и избегайте возврата null, если в JavaDoc четко не указано, что null является допустимым возвращаемым значением.

(и: даже если Field устарело: используйте его для проверки, чтобы выяснить, связана ли проблема с Fieldables. Если ваш код работает с Field объектами, тогда вы знаете, где искать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...