Нулевой указатель на моем фасаде :( - PullRequest
1 голос
/ 18 декабря 2010

Я написал диспетчер задач, и хорошо, это длинная история ... все на Java, кстати. Итак, я написал Фасад, который, как вы можете видеть ниже, есть проблема с HashMap, и я подозреваю, что значения, которые я пытаюсь добавить в HashMap во время построения, идут не так хорошо. Метод, который вызывает исключение нулевого указателя, является методом create. входные параметры метода были проверены мной и моим верным отладчиком для заполнения.

любая помощь здесь будет отличной ... Я уверен, что забыл упомянуть кое-что, поэтому я отвечу на комментарии как можно скорее, поскольку мне нужно сделать это сейчас.

package persistence;

import java.util.UUID;
import java.util.HashMap;

import persistence.framework.ComplexTaskRDBMapper;
import persistence.framework.IMapper;
import persistence.framework.RepeatingTaskRDBMapper;
import persistence.framework.SingleTaskRDBMapper;

public class PersistanceFacade {

    @SuppressWarnings("unchecked")
    private static Class SingleTask;
    @SuppressWarnings("unchecked")
    private static Class RepeatingTask;
    @SuppressWarnings("unchecked")
    private static Class ComplexTask;

    private static PersistanceFacade uniqueInstance = null;
    @SuppressWarnings("unchecked")
    private HashMap<Class, IMapper> mappers;

    public PersistanceFacade() {
        mappers = new HashMap<Class, IMapper>();
        try {
            SingleTask = Class.forName("SingleTask");
            RepeatingTask = Class.forName("RepeatingTask");
            ComplexTask = Class.forName("ComplexTask");
            mappers.put(SingleTask, new SingleTaskRDBMapper());
            mappers.put(RepeatingTask, new RepeatingTaskRDBMapper());
            mappers.put(ComplexTask, new ComplexTaskRDBMapper());
        }
        catch (ClassNotFoundException e) {}

    }

    public static synchronized PersistanceFacade getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new PersistanceFacade();
            return uniqueInstance;
        }
        else return uniqueInstance;
    }

    public void create(UUID oid, Object obj) {
        IMapper mapper = (IMapper) mappers.get(obj.getClass());
        mapper.create(oid, obj);
    }

    @SuppressWarnings("unchecked")
    public Object read(UUID oid, Class type) {
        IMapper mapper = (IMapper) mappers.get(type);
        return mapper.read(oid);
    }

    public void update(UUID oid, Object obj) {
        IMapper mapper = (IMapper) mappers.get(obj.getClass());
        mapper.update(oid, obj);
    }

    @SuppressWarnings("unchecked")
    public void destroy(UUID oid, Class type) {
        IMapper mapper = (IMapper) mappers.get(type);
        mapper.destroy(oid);
    }


}

Ответы [ 3 ]

2 голосов
/ 18 декабря 2010

Чтобы Class.forName("RepeatingTask") возвратил класс, у вас должен быть класс persistence.RepeatingTask.Но в своем комментарии вы говорите, что obj.getClass() возвращает domain.RepeatingTask, поэтому мне кажется, что у вас есть 2 класса "RepeatingTask" или domain.RepeatingTask является подтипом.

1 голос
/ 18 декабря 2010

Я предполагаю, что ваша проблема заключается в конструкторе:

    try {
        SingleTask = Class.forName("SingleTask");
        RepeatingTask = Class.forName("RepeatingTask");
        ComplexTask = Class.forName("ComplexTask");
        mappers.put(SingleTask, new SingleTaskRDBMapper());
        mappers.put(RepeatingTask, new RepeatingTaskRDBMapper());
        mappers.put(ComplexTask, new ComplexTaskRDBMapper());
    }
    catch (ClassNotFoundException e) {}

Вы молча игнорируете ClassNotFOundException.Если вы добавите протоколирование к улову, я ожидаю, что он сообщит вам, что класс SingleTask не найден, так как я ожидаю, что вы не поместили эти классы в пакет по умолчанию.

Учитывая ваш ответ на комментарии, этиклассы находятся в пакете domain., поэтому вы можете попытаться изменить его на:

    try {
        SingleTask = Class.forName("domain.SingleTask");
        RepeatingTask = Class.forName("domain.RepeatingTask");
        ComplexTask = Class.forName("domain.ComplexTask");
        mappers.put(SingleTask, new SingleTaskRDBMapper());
        mappers.put(RepeatingTask, new RepeatingTaskRDBMapper());
        mappers.put(ComplexTask, new ComplexTaskRDBMapper());
    }
    catch (ClassNotFoundException e) {
        log.warn("Cannot load class", e);
    }

Кстати, добавление регистрации в ваш код поможет найти причины непредвиденного поведения.

0 голосов
/ 18 декабря 2010

Class.forName("SingleTask"); вызывает исключение ClassCastException, поэтому мапперы не заполняются.Поскольку вы игнорируете ClassCastExeption в своем конструкторе, вы пропустили эту ошибку, похоже.

...