ReflectionUtil getField создает исключение NullPointerException - PullRequest
1 голос
/ 02 марта 2011

Я использую класс, который делает мой Hibernate Query через FilterCriterionList (своего рода видоискатель), и до сих пор он всегда работал идеально и вызывает исключение NullPointerException, и у меня нет абсолютно никакой идеи относительно того, почему он срабатывает.

Этоэто метод (в ReflectionUtil), который запускает нулевой указатель со следующими значениями (учтите, что другие значения, сгенерированные в нем, работают отлично, и именно они, кажется, дают ошибку):

type = interface java.util.List

fieldName = параметр

Сначала он генерирует исключение NoSuchFieldException и при втором запуске (как он вызывается снова в field = getField (type.getSuperclass (), fieldName);) делает егобросить NullPointerException и просто остановиться (все это происходит в моем UnitTest, а не в реальной среде пока ).

public static Field getField(Class type, String fieldName) {
        Field field = null;
        try {
            field = type.getDeclaredField(fieldName);
        } catch (Exception e) {
            if (!type.equals(Object.class)) {
                field = getField(type.getSuperclass(), fieldName);
            }
        }
        return field;
    }

Любые идеи относительно того, почему это происходит (или что я могусделать, чтобы это исправить?).Я не могу похвастаться большим количеством кода, так как он довольно сложный, и это код компании.

Ответы [ 3 ]

1 голос
/ 02 марта 2011

java.util.List - это интерфейс, поэтому вызов getSuperclass() для него приводит к null.

Рекурсивный способ применения getField() следующий:

} catch (Exception e) {
    Class superclass = type.getSuperclass();
    if (superclass != null) {
        field = getField(superclass, fieldName);
    }
}
0 голосов
/ 02 марта 2011

Из документации Class.getSuperclass

Возвращает класс, представляющий суперкласс сущности (класс, интерфейс, примитивный тип или пустота) представлены этим классом. Если это Класс представляет собой либо объект класс, интерфейс, примитивный тип, или void, тогда возвращается ноль . Если этот объект представляет класс массива тогда объект Class, представляющий Класс объекта возвращается.

0 голосов
/ 02 марта 2011

Вы назвали так:

getField(List.class, "parameter");

Это никогда бы не сработало, поскольку List - это интерфейс, и у него нет поля с именем parameter. Для второго вызова его 'null, потому что интерфейс List не имеет суперкласса.

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